【问题标题】:In C++ what is the difference between (int *) and &?在 C++ 中 (int *) 和 & 之间有什么区别?
【发布时间】:2014-06-12 13:19:50
【问题描述】:

我是编程新手,只是为了更好地理解书本课程中涵盖的概念而自行修补;但是,我找不到以下解释:在下面的代码中,为什么使用 (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;    

【问题讨论】:

  • 因为&amp;(int *)不是一回事;把问题转过来:你为什么希望他们给出相同的结果?
  • 使用(int *) 不会神奇地将你的变量变成一个地址...
  • @OliCharlesworth 据我了解,它们是实现相同结果的不同方式。它们都将显示指针指向的位置。我一定是误解了课程内容。
  • @Joshua 不,&amp;cat 给你的是指针的地址,而不是它指向的东西。

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


【解决方案1】:

您显示的代码是非法的(不可移植的 C++)。

语法(int *) 表示字符串文字"tiger" 的地址被强制转换为指向整数的指针,但这是不允许的,并且可能导致未定义的行为。

您可以将任何指针类型强制转换为指向 char 的指针或指向 unsigned char 的指针,但不能反过来。

原因是在某些架构中,整数和其他大型类型必须位于特定地址(例如,位于 4 的倍数的地址)。对于未定义的行为,只需创建具有无效地址的指针就足够了(取消引用不是必需的,因为在某些 CPU 上,即使只是将无效地址加载到用于索引整数的寄存器也会引发硬件陷阱)。

在 PC (x86) 上,转换不会产生问题(可能是性能问题除外),只是意味着编译器会将包含 "tige" 的内存视为整数。取消引用整数(即打印 *((int *)&amp;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'

【讨论】:

  • @BenjaminBannier:不能以任何方式使用无效指针。解引用不是遇到问题所必需的。
  • 刚刚看到你的编辑,有趣的点(我来自 x86 隔都)。
  • @BenjaminBannier:它们今天并不常见,但例如,我过去一直在使用 HP risc 机器,其中加载错误地址会导致程序因总线错误而终止。
【解决方案2】:

当您执行&amp;cat 时,其中cat 是一个指针,您将获得存储cat 本身的内存位置。

当您执行(int*) cat 时,您只是将cat 的内容解释为int*

如果这两者是等价的,那将是非常出乎意料的。

【讨论】:

    【解决方案3】:

    使用&amp; 表示“地址”。

    使用(int *) 表示“将值视为地址”。

    所以在这种情况下,(int *) 将值“tiger”视为int 指针。 *(有点)

    *这有点复杂。它不完全是 "tiger" 的值,因为它是从 const char * 而不是字符串文字本身进行转换的。相反,cat 是指向 "tiger" 在内存中的位置的指针,因此 (int *)cat 实际上是指向 cat 在内存中的位置的整数指针。

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

    【讨论】:

    • 那么字符串文字的转换在哪里?我所看到的只是const char* 的演员表。
    • 好点 - 我更新了我的回复。我想我有点草率了。
    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2010-12-21
    • 2012-08-30
    • 2017-10-17
    • 2015-01-06
    • 2021-01-05
    相关资源
    最近更新 更多