& a [i]和a + i之间有什么区别,其中a是int *?

时间:2018-04-14 15:51:58

标签: c language-lawyer

显然,&a[i]a+i都会返回int*。问题是它们是否以相同的方式执行,因为&a[i]中有两个运算符,a+i只有一个运算符?

2 个答案:

答案 0 :(得分:12)

在C中,它们是相同的。 C标准将a[i]定义为与*(a + i)相同,因此&a[i]仅为&*(a + i),即a + i。 (令人惊讶的结果是你可以轻松地写i[a]。)

运营商的数量在这里没有实际意义。

答案 1 :(得分:5)

从历史上看,从技术上讲,给定int a[10];&a[10]过去在技术上是无效的,因为它将指针取消引用超过数组的末尾,而a+10始终有效。

如今:a[i]定义为*(a+i),因此&a[i]表示&*(a+i)。当a是数组或指针,i是整数时,则是,等于a+i。当&*都应用于同一指针表达式时,它们现在被明确指定为无效。

对历史感兴趣的人的更多细节:这是在C99中添加的文本。

  

6.5.3.2地址和间接运营商

     

3 [...]如果操作数是一元*运算符的结果,则不会对该运算符和&运算符进行求值,结果就好像两者都是   省略,除了对运算符的约束仍然适用且结果不是左值。

此文本尚未在C89 / C90中出现,因此指向*运算符的指针必须实际指向仍在技术上应用的对象或函数。该标准专门更改,以使此类结构有效。