在 C++ 中,取消引用和获取索引零是否执行相同的操作?

In C++, do dereferencing and getting index zero do the same tihng?

提问人:eje211 提问时间:4/12/2016 最后编辑:2501eje211 更新时间:4/12/2016 访问量:455

问:

我刚刚尝试了这段代码:

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

两行返回相同的内容。

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

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

C++ 指针 取消引用

评论

0赞 wally 4/12/2016
我应该这么认为,但我不确定。释放语言律师。
5赞 zneak 4/12/2016
这在 C 语言中是正确的。如果你不重载运算符,在 C++ 中也是如此。
0赞 Arif Burhan 4/12/2016
pi=&i 得到 i 时,请使用 *pi 。你有 *pi = &i ,这是双间接的。
0赞 fukanchik 4/12/2016
查看 en.wikibooks.org/wiki/C_Programming/...
0赞 Pete Becker 4/12/2016
@ArifBurhan - 不,是指向 int 的指针的定义。它还使用地址进行初始化。int *pi = &i;pipii

答:

7赞 AlexD 4/12/2016 #1

假设没有操作员过载,它们几乎相同。

[C] 6.5.2.1 数组下标

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

[C++] 5.2.1 下标

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

请参阅@T.C关于最后一部分的精彩答案

评论

0赞 wally 4/12/2016
很高兴看到对标准的实际引用。这是否意味着这与?E1[E2]E2[E1]
0赞 AlexD 4/12/2016
@T.C. 噢,确实如此!纠正。顺便说一句,在我编辑并添加第一句话之前,反对票就到了)。
1赞 user4581301 4/12/2016
在互联网的一个黑暗角落里,坐着一个人兴高采烈地哼唱。“一个下来,17,710 去......”
0赞 AlexD 4/12/2016
@flatmouse 是的,E1[E2] 与 E2[E1] 相同。同样,如果没有发生特殊情况。(这意味着你可以写 1[a] 而不是 a[1]。
4赞 fuzzything44 4/12/2016 #2

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

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

11赞 T.C. 4/12/2016 #3

忽略重载运算符,有一种情况是有区别的,那就是 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

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

评论

0赞 AlexD 4/12/2016
+1.我刚刚意识到我没有完全引用。纠正。5.2.1