(ptr + i)->Func() 和 &ptr[i].Func() 之间有什么区别吗

Is there any difference between (ptr + i)->Func() and &ptr[i].Func()

或者两者相等? ptr 是指向结构数组的指针。

UPD: 谢谢大家的回复。对不起,我拼错了语法。我要比较的是 (ptr + i)->Func()(&ptr[i])->Func()。我对 & 运算符感到困惑,因为它应该是 return 变量的地址。不就多了一次取那个地址的操作吗?

(ptr + i)->Func() 等价于 ptr[i].Func().

并且由于运算符的优先级,&ptr[i].Func() 等同于 &(ptr[i].Func()),即它取 Func() 的 return 值的地址。

没有区别。 ptr[i] 由标准保证完全等同于 *(ptr+i)。前者通常更容易阅读。

我假设 struct 或 class 具有 Func 函数。 所以通过地址访问函数与访问字段是一样的。 在我看来,这只是解决算术差异。 所以?两者相等。

您的意思可能是 &ptr[i]->Func(),否则您的表达式不具有相同的功能。

根据C++标准,将指针类型的值与整数类型的值相加会产生一个与原始类型相同的指针,其偏移量等于整数类型的值。取地址 ptr[offset] 产生相同的值,所以两者是相同的。此外,添加的顺序无关紧要,所以下面所有的表达式都做同样的事情,并且应该产生相同的可执行代码:

&ptr[i]
(ptr+i)
(i+ptr)
&(i[ptr]) // <<== Don't do this!

最后一项只是出于好奇。不要在编程难题之外的代码中使用此构造。