繁体   English   中英

在C ++中(int *)和&有什么区别?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM