&a[0]++;是错误语句,编译都不会过。因为++是后++,在执行该语句时是不计算的,所以a[0]++是个表达式而不是值,显然用&取一个表达式的地址是非法操作!而如果是&++a[0];则是正确的,因为前++在执行&时已经计算过了:就是先给a[0]+1,然后再取a[0]的地址。
&a[0]+1;是正确语句,因为&的优先级比+高,所以是先取a[0]的地址再给这个地址+一个元素所占字节数——就是说&a[0]+1是a[1]的地址。
不一样!
++的优先级比&高,&比+高!
所以&a[0]++是进行a[0]=a[0]+1之后,在取a[0]的地址
而&a[0]+1是先取a[0]的地址,然后将指向这个地址的指针(假设int *p;p=&a[0];)移动一个数据长度,即指向了a[1];
&a[0]++
就是
{
*p;定义类型没有写
a[0]+=1;
p=&a[0];
}
&a[0]+1
就是
{
*p;定义类型没有写
p=&a[0]
p++;
}
a[0]表示数组a 的第一个元素,
&a[0]是取a[0]在内存中的地址
&a[0]++是将a[0]在内存中的地址向前移动一个单位.
理论上&a[0]+1和&a[0]++的执行效果是差不多的
&a[0]++表示程序运行时会对运行结果自加1
&a[0]+1表示程序运行时对结果加上1,如果改为2就会加上2
编译错误如下,都是取得数组a的第二个元素的地址&a[0]++与&(a[0]++)等价:6,无法编译通过,不能取得地址;
表示a[0]++不是一个左值:
non-lvalue
in
unary
`&'.cpp:
main。
而&a[0]+1与a+1和&a[1]是等价的