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

Jox*_*xon 2 c language-lawyer

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

Die*_*Epp 12

在C中,它们是相同的.C标准定义a[i]为相同*(a + i),所以&a[i]仅仅&*(a + i)a + i.(令人惊讶的结果是你可以轻松写出来i[a].)

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


小智 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中还没有出现,所以操作符号的指针*必须实际指向一个技术上仍然适用的对象或函数.专门更改标准以使此类构造有效.

  • @Stargateur回答这个问题并提供额外的信息也很好.这个问题并没有问到我是谁,但我认为Dietrich Epp选择在他的回答中加入这个问题并不是什么问题. (4认同)
  • 什么时候`&a [10]`无效? (2认同)