我是编程新手,只是自己修补一下,以更好地感受书中课程中涵盖的概念;但是,我无法找到以下解释:在下面的代码中,为什么使用(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;
答案 0 :(得分:4)
您展示的代码是非法的(非可移植C ++)。
语法(int *)
表示字符串文字"tiger"
的地址被转换为指向整数的指针,但这是不允许的,并且可能导致未定义的行为。
您可以将任何指针类型强制转换为指向char或指向unsigned 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'
答案 1 :(得分:1)
执行&cat
时,cat
是指针,您将获得存储cat
本身的内存位置。
执行(int*) cat
后,您只需将cat
的内容解释为int*
。
如果这两者相当,那将是非常意外的。
答案 2 :(得分:0)
使用&
表示'地址'。
使用(int *)
表示“将值视为地址”。
因此,在这种情况下,(int *)
将值“tiger”视为int
指针。 *(有点)
*有点复杂。它不是值"tiger"
,因为它是从const char *
而不是字符串文字本身进行转换。相反,cat
是指向"tiger"
在内存中的位置的指针,因此(int *)cat
实际上是指向cat
在内存中的位置的整数指针。
另一方面,&cat
是cat
的地址 - 实际上是"tiger"
指针的地址。