【问题标题】:In C++, do dereferencing and getting index zero do the same tihng?在 C++ 中,取消引用和获取索引为零是否做同样的事情?
【发布时间】:2016-08-02 05:31:19
【问题描述】:

我刚试过这段代码:

int i = 33;
int * pi = &i;
cout << "i: " << *pi << endl;
cout << "i: " << pi[0] << endl;

两行返回相同的内容。

基本上,如果我得到任何指针的索引为零,我将在指针的位置获得正确类型的值。这和取消引用不是一回事吗?

每次在 C++ 中取消引用指针时,获取索引为零是否也有效?我并不是建议任何人实际上应该这样做,但我认为它会工作。不会吧?

【问题讨论】:

  • 我应该这么认为,但我不确定。释放语言律师。
  • 这在 C 中是正确的。如果你不重载运算符,在 C++ 中也是如此。
  • pi=&i 让我回来使用 *pi 。你有 *pi = &i ,这是双重间接。
  • @ArifBurhan - 不,int *pi = &amp;i;pi定义,作为指向 int 的指针。它还用i的地址初始化pi

标签: c++ pointers dereference


【解决方案1】:

假设没有运算符重载,它们几乎相同。

[C] 6.5.2.1 数组下标

E1[E2] 等同于(*((E1)+(E2)))

[C++] 5.2.1 下标

表达式 E1[E2]*((E1)+(E2)) ... 相同(根据定义),除了在数组操作数的情况下,结果是 如果该操作数是左值,则为左值,否则为 xvalue。

关于最后一部分,请参阅 @T.Canswer

【讨论】:

  • 很高兴看到对标准的实际引用。这是否意味着E1[E2]E2[E1] 相同?
  • @T.C.哦,确实!已更正。顺便说一句,在我编辑并添加第一句话之前 投反对票)。
  • 在互联网的一个黑暗角落里,坐着一个人兴高采烈地开怀大笑。 “一个下来,还有 17,710 个……”
  • @flatmouse 是的,E1[E2] 与 E2[E1] 相同。再次,如果没有特殊情况发生。 (意思是你可以写 1[a] 而不是 a[1]。)
【解决方案2】:

忽略重载的运算符,有一种情况是有区别的,那就是DR1213后的数组右值:

using arr = int[2];
arr&& f();
int&& b = *f(); // error, *f() is an lvalue, doesn't bind to int&&
int&& c = f()[0]; // OK, subscript applied to array rvalue results in an xvalue

不过,我不知道有任何编译器实现了该解决方案。但它最终应该被实施。

【讨论】:

  • +1。我才意识到我没有完全引用5.2.1。已更正。
【解决方案3】:

对于指针,它们应该给出相同的结果。

它们唯一可能不同的情况是,如果您将它们应用于以不同方式重载 operator*()operator[](int) 的用户定义类型(或者一个而不是另一个,在这种情况下您会收到编译错误) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2012-12-22
    相关资源
    最近更新 更多