我已经看到了指针算术的解释(例如Pointer Arithmetic)。但我想知道两者之间是否有真正的区别:
鉴于:
int* arr = (int*) malloc(sizeof(int) * 3);
做:
&(arr[1])
和:
arr + 1
以任何方式不同,除了语法。两者在技术上更有效吗?是否有特定的上下文可以在第一个上使用指针成瘾?我看到了Printing 1 to 1000 without loop or conditionals的一个例子。提前致谢。
我已经看到了指针算术的解释(例如Pointer Arithmetic)。但我想知道两者之间是否有真正的区别:
鉴于:
int* arr = (int*) malloc(sizeof(int) * 3);
做:
&(arr[1])
和:
arr + 1
以任何方式不同,除了语法。两者在技术上更有效吗?是否有特定的上下文可以在第一个上使用指针成瘾?我看到了Printing 1 to 1000 without loop or conditionals的一个例子。提前致谢。
&arr[1]
和arr + 1
(和&1[arr]
!)是相同的,并且都计算相同的指针。根据 C 标准,§6.5.3.2:
一元 & 运算符产生其操作数的地址....
...如果操作数是 [] 运算符的结果,则 & 运算符和 [] 所隐含的一元 * 都不会被计算,结果就像 & 运算符被删除并且 [] 运算符被更改到 + 运算符。
因此,根据规范,&arr[1]
要像编写的一样进行评估arr + 1
。
使用其中一个通常归结为偏好。就个人而言,&arr[x]
当我想指代一个指向该元素的指针时,以及arr + x
当我想引用从x
.
不,没有区别,甚至在性能上也没有(除非我们谈论的是编译时间),因为:
arr[1]
相当于*(arr + 1)
和&(*(arr + 1))
取消引用和地址运算符都没有做任何事情(C 标准明确指出,在这种情况下不会发生取消引用),因此运算符相互抵消。因此,在解析和 AST 构建阶段之后,编译器最终只能arr + 1
在两种情况下结束。