4

我已经看到了指针算术的解释(例如Pointer Arithmetic)。但我想知道两者之间是否有真正的区别:
鉴于:

int* arr = (int*) malloc(sizeof(int) * 3);

做:

&(arr[1])

和:

arr + 1

以任何方式不同,除了语法。两者在技术上更有效吗?是否有特定的上下文可以在第一个上使用指针成瘾?我看到了Printing 1 to 1000 without loop or conditionals的一个例子。提前致谢。

4

2 回答 2

5

&arr[1]arr + 1(和&1[arr]!)是相同的,并且都计算相同的指针。根据 C 标准,§6.5.3.2

一元 & 运算符产生其操作数的地址....

...如果操作数是 [] 运算符的结果,则 & 运算符和 [] 所隐含的一元 * 都不会被计算,结果就像 & 运算符被删除并且 [] 运算符被更改到 + 运算符。

因此,根据规范,&arr[1]要像编写的一样进行评估arr + 1

使用其中一个通常归结为偏好。就个人而言,&arr[x]当我想指代一个指向该元素的指针时,以及arr + x当我想引用从x.

于 2013-04-09T01:17:03.740 回答
1

不,没有区别,甚至在性能上也没有(除非我们谈论的是编译时间),因为:

  • arr[1]相当于*(arr + 1)
  • &(*(arr + 1))取消引用和地址运算符都没有做任何事情(C 标准明确指出,在这种情况下不会发生取消引用),因此运算符相互抵消。

因此,在解析和 AST 构建阶段之后,编译器最终只能arr + 1在两种情况下结束。

于 2013-04-09T01:21:57.893 回答