[英]In C++ what is the difference between (int *) and &?
我是编程的新手,只是自己动手修改一下,以更好地理解本书课程中介绍的概念; 但是,我找不到以下解释:在下面的代码中,为什么使用(INT *)返回的地址与使用&返回的地址不同?
char animal[20] = "doberman";
const char * cat = "tiger";
std::cout << "\nanimal: " << animal << std::endl;
std::cout<< "cat: " << cat << std::endl;
std::cout << "-----\n";
std::cout << "&animal: " << &animal << std::endl;
std::cout << "&cat: " << &cat << std::endl;
std::cout << "(int *) cat: " << (int *) cat << std::endl;
您显示的代码是非法的(不可移植的C ++)。
语法(int *)
表示字符串文字"tiger"
的地址被强制转换为指向整数的指针,但这是不允许的,并且可能导致未定义的行为。
您可以将任何类型的指针强制转换为指向char或无符号char的指针,但不能相反。
原因是在某些体系结构中,整数和其他大类型必须位于某个地址(例如,是4的倍数的地址)。 仅使用无效地址创建指针就足以实现未定义的行为(因为在某些CPU上,即使只是将无效地址加载到用于索引整数的寄存器中,也不需要进行引用,这会引发硬件陷阱)。
在PC(x86)上,该转换不会产生问题(可能是性能问题除外),仅意味着编译器会将包含"tige"
的内存视为整数。 取消引用整数(即打印*((int *)&cat)
)应该得到1701276020
116 + // ASCII code for 't'
105 * 256 + // ASCII code for 'i'
103 * 65536 + // ASCII code for 'g'
101 * 16777216 // ASCII code for 'e'
当执行&cat
(其中cat
是指针)时,您将获得存储cat
本身的内存位置。
当您执行(int*) cat
,您只是将cat
的内容解释为int*
。
如果这两个是等效的,那将是非常意外的。
使用&
表示“的地址”。
使用(int *)
表示“处理值作为地址”。
因此,在这种情况下, (int *)
将值“ tiger”视为int
指针。 *(有点)
*有点复杂。 它不是确切的"tiger"
值,因为它是从const char *
而不是字符串文字本身进行强制转换。 相反, cat
是指向"tiger"
在内存中的位置的指针,因此(int *)cat
实际上将是指向cat
在内存中的位置的整数指针。
在另一方面, &cat
是地址cat
-这实际上是指针的地址"tiger"
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.