p++ 与 ++p
int a [ 3 ] = { 1 , 2 , 3 } ;
int * p = a 或 int * p = & a [ 0 ] ;
(1)p = p + 1与 p ++ 与 ++ p 不参与其他运算时意义相同,都代表指针变量增加了一个int型字节大小,在参与其他混合运算时意义不同。
printf ( " % p " , p );
% p == 0xaaaa0000
printf ( " % p " , p+1); //由于是整型在 p 的基础上增加4个字节
% p == 0xaaaa0004
printf ( " % p " , p = p+1); //意义与 p + 1 相同
% p == 0xaaaa0004
printf ( " % p " , p ++); // p 在前 ++ 在后,printf 先执行输出 p 的值,再进行 ++ 运算
% p == 0xaaaa0000
printf ( " % p " , ++ p);// ++ 在前 p 在后,printf输出的是 ++运算后的值
% p == 0xaaaa0004
数组(&a[0] || a )
int a [ 3 ] = { 1 , 2 , 3 } ;
int * p = NULL ;
a + 1 || & a [ 0 ] + 1 ; //没有语法错误,只是无意义,因为没有赋值
a = a + 1 || & a [ i ] = & a [ 0 ] + 1 ; //语法错误,数组或者变量的首地址不能进行赋值修改。
p = a + 1 || p = & a [ 0 ] + 1 ; //没有对数组做任何修改,将值赋值给了指针变量 p 。
a ++ || & a [ 0 ] ++ ; //语法错误,数组或者变量的首地址不能进行赋值修改。
++ a || ++ & a [ 0 ] ; //语法错误,数组或者变量的首地址不能进行赋值修改。
混合运算中的 p++ || ++p
int num = 10;
int sum , x = 1 , y = 2;
int * q = NULL;
int * p = & num;
if ( num ++ ) // if 先判断num的值,再进行 num++ 运算
if(++ num)// if 判断的是 num ++ 的值
sum = ( x -- == y ++ ) ? -- x : y -- ; //()里判断的是 x == y,而不是 x -- == y;
q = p ++ // q 被赋值的是 p 的地址,而不是 p++
q = ++ p // q 中的地址是 p 增加了一个int型的字节的地址