【问题标题】:Is the address of a reference to a dereferenced pointer the same as the address of the pointer?对取消引用的指针的引用地址是否与指针的地址相同?
【发布时间】:2011-05-19 14:40:06
【问题描述】:

在 C++ 中,对取消引用的指针的引用地址是否保证与指针的地址相同?

或者,用代码编写,是否保证以下断言始终成立?

SomeType *ptr = someAddress;
SomeType &ref = *ptr;
assert(&ref == ptr);

【问题讨论】:

  • @dlev:他怎么可能“尝试”是否保证相同?如果他只想知道对于一个特定程序在一个特定 C++ 实现上的一次特定运行是否相等,他为什么要问它是否有保证?
  • @Steve 显然他不能,但是运行几次应该足以让你相信这是真的。也就是说,你是对的,他确实说保证
  • 代码正确,问题比较“有问题”。我会将“指针的地址”读作&ptr,这与指向的对象的地址不同。
  • @dlev:在此基础上,我确信sizeof(int) == sizeof(void*) 是有保证的。我预测未来会很糟糕;-)。我们只知道尝试 Jesper 的 assert 会给出正确的答案,因为我们碰巧知道您在任何地方都会得到相同答案的根本原因。但如果你不知道它在任何地方都是一样的,那么你就不能依赖测试。如果你确实知道它在任何地方都是一样的,那么你就已经知道问题的答案了......
  • @Steve 可能出了什么问题?无论如何,这只是字节。

标签: c++ pointers reference memory-address


【解决方案1】:

是的,这是正确的,并且永远是正确的。

引用只不过是它所引用的类型的别名。它没有单独的存在,它总是与它所指的那个联系在一起。

【讨论】:

    【解决方案2】:

    是的,当然前提是someAddress 不是空指针,否则不允许取消引用。在这种情况下,行为是未定义的,尽管您的实现可能表现得好像它们是相等的,尤其是在优化级别较低的情况下。

    如果你想准确一点,那么&ref 并不是真正的“引用地址”,而是“引用的引用地址”。由于ref 绑定到*ptr,这意味着ref 的引用对象和ptr 的引用对象(或指针,如果您愿意)是同一个对象,因此两个地址&refptr是平等的。

    正如 Bo 所指出的,您将 &ref 与“指针的值”或“存储在指针中的地址”进行比较,而不是“指针的地址”。

    【讨论】:

    • +1 请注意&ref 不返回存储引用本身的地址,而是返回被引用对象的地址。
    【解决方案3】:

    是的,如果引用本身有地址,则它由实现管理,不能从代码访问。无论如何,它只是同一个对象的不同名称。

    【讨论】:

      【解决方案4】:

      是的,你的理解是正确的。对于世界上 99.(9)% 的代码,您的代码将是正确的。对于听众中的学究们(我自己也在其中),这种说法并不总是正确的:

      SomeType *ptr = someAddress;
      SomeType &ref = *ptr;
      assert(&ref == ptr);
      

      考虑这个程序:

      #include <cassert>
      struct SomeType { void* operator&() { return 0; } };
      int main() {
        SomeType *ptr = new SomeType;
        SomeType &ref = *ptr;
        assert(&ref == ptr);
      }
      

      【讨论】:

      • 作为迂腐的我不禁注意到 99.(9) 等于 100。
      猜你喜欢
      • 2013-11-06
      • 2020-02-11
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      相关资源
      最近更新 更多