或两者都是平等的? ptr是指向结构数组的指针。
UPD:谢谢大家的回复。对不起,我拼错了语法。我想要比较的是(ptr + i)->Func()
与(&ptr[i])->Func()
。我与&
运算符混淆,因为它应该返回变量的地址。是否会导致再次采取该地址的操作?
答案 0 :(得分:8)
(ptr + i)->Func()
相当于ptr[i].Func()
。
由于运算符优先级,&ptr[i].Func()
等同于&(ptr[i].Func())
,即它需要Func()
的返回值的地址。
答案 1 :(得分:2)
没有区别。标准保证ptr[i]
完全等同于*(ptr+i)
。前者通常更容易阅读。
答案 2 :(得分:1)
我假设struct或class具有Func函数。 因此,按地址访问功能与访问该字段的功能相同。 在我看来,它只是地址算术差异。 所以?两者都是平等的。
答案 3 :(得分:1)
您可能意味着&ptr[i]->Func()
,否则您的表达式没有相同的功能。
根据C ++标准,将指针类型的值添加到整数类型的值会产生与原始相同类型的指针,其偏移量等于整数类型的值。取ptr[offset]
的地址产生相同的值,因此两者是相同的。此外,添加的顺序无关紧要,因此下面的所有表达式都做同样的事情,并且应该生成相同的可执行代码:
&ptr[i]
(ptr+i)
(i+ptr)
&(i[ptr]) // <<== Don't do this!
最后一项只是好奇心。不要在编程难题之外的代码中使用此构造。