提问人:eje211 提问时间:4/12/2016 最后编辑:2501eje211 更新时间:4/12/2016 访问量:455
在 C++ 中,取消引用和获取索引零是否执行相同的操作?
In C++, do dereferencing and getting index zero do the same tihng?
问:
我刚刚尝试了这段代码:
int i = 33;
int * pi = &i;
cout << "i: " << *pi << endl;
cout << "i: " << pi[0] << endl;
两行返回相同的内容。
从本质上讲,如果我得到任何指针的索引零,我将在指针的位置获得正确类型的值。这和取消引用不是一回事吗?
每次在 C++ 中取消引用指针时,获取索引零是否也有效?我并不是建议任何人应该这样做,但我认为它会起作用。不是吗?
答:
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
评论
int *pi = &i;
pi
pi
i