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

In C++ what is the difference between (int *) and &?

本文关键字:什么 区别 int C++      更新时间:2023-10-16

我是编程新手,只是自己修补,以更好地了解书本课程中涵盖的概念;但是,我找不到以下解释: 在下面的代码中,为什么返回的地址使用 (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 的指针或指向无符号字符的指针,但不能反过来。

原因是有些架构中整数和其他大型类型必须位于某个地址(例如,位于 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在内存中的位置的整数指针。

另一方面,&catcat的地址 - 实际上是指向"tiger"的指针的地址。