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