在C语言中,可以同时使用&和[]快速获取指向数组中对象的指针吗?

Ric*_*ove -1 c performance

我知道这可以获取索引(并自动执行指针算术):

struct Obj *c = &p[i];

但是,与手动执行指针算术相比,这是否会对性能产生影响?

struct Obj *c = p+i;

有什么理由可以避免使用第一个?

Joh*_*ger 5

但是,与手动执行指针算术相比,这是否会对性能产生影响?

使用索引运算符的表达式被定义为等效于涉及指针算术和解引用的相应操作,因此

&p[i]
Run Code Online (Sandbox Code Playgroud)

完全等同于

&(*(p + i))
Run Code Online (Sandbox Code Playgroud)

该标准还规定,当运算&符的操作数是运算符的结果时*,均不会被评估,并且结果好像都被忽略了,因此依次等于

p + i
Run Code Online (Sandbox Code Playgroud)

,它已定义了行为,只要它不希望产生一个指向要从其p派生指针的数组的开始之前指向的指针,并且不超过其末尾的一个位置即可。

尽管可以想象编译器在一种情况下会产生与另一种情况不同或更差的代码,但是没有理由期望这样做。

有什么理由可以避免使用第一个?

不多。后者具有较轻的认知负担,并且更易于阅读,因为(在语法上)仅涉及一项操作而不是两项操作。由于这个原因,我本人倾向于自己喜欢它。另一方面,理解它可能会不太直观。

  • @EugeneSh。是的,`*(p + i)`正在取消引用,并且我指定了以下等效项是临时的,因为“ i”小于数组元素的数量。但是,正如user3386109所观察到的,还有一个明确的特殊规定,即当对&*运算符的结果应用`&`时,*均不会被评估*,并且好像都被省略了。这是在标准的[6.5.3.2/3段](http://port70.net/~nsz/c/c11/n1570.html#6.5.3.2p3)中。 (3认同)
  • 我认为标准中有一个特殊的规则,即&& p完全等同于p。 (2认同)