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

标签 c++ pointers c++11 memory-management

我是编程新手,只是靠自己修修补补,以便更好地理解书本类(class)中涵盖的概念;但是,我找不到以下内容的解释:在下面的代码中,为什么使用 (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 的指针或指向 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'

关于c++ - 在 C++ 中,(int *) 和 & 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23316624/

相关文章:

c++ - 模板类中的运算符 "()"

c++ - 从代码块开始,构建 Hello world 不起作用(权限被拒绝)

c - 被 C 语法困住了

c++ - 双指针和它们之间的括号

c++ - 为什么 move 指针变量不会将其设置为空?

c++ - 是否有 C++ 方法允许在不创建临时变量的情况下多次使用函数指针?

c++ - 如何使用已删除的复制构造函数初始化类数组(C++11)

c++ - Visual Studio 告诉我缺少 ';' 。 (C++ 新手)

c++ - 检查 T 是否为左值的特征,不包括字符串文字

c - 指针算术以 Code139(段错误)终止程序