/*例:把一个数组的内容复制给另一个数组*/
#define SIZE 50
int x[SIZE];
int y[SIZE];
int *p1, *p2;
void try2()
{
for( p1=x, p2=y; p1-x<SIZE; )
*p1++=*p2++;
}
-
*p1++
后缀++ 操作符的优先级与*操作符一样,但根据结合性右向左,即*p1++ = *(p1++)
故执行顺序为:p1++ >> p1+1 >> *p1
注:++*p1,前缀++和*优先级相同,根据操作符结合性从右向左执行,先*后++。
-
p++
先返回p值的一份拷贝然后再增加p的值。
表达式p++的值就是p原来的值的一份拷贝。
注:下次再调用p++时,p的值就是之前p+1后的值。
- *p1++=*p2++
c语言从右往左压栈,
1.先计算p2++,产生对p2的一份拷贝,
2.++操作符增加p2的值(将指针p2向后移动1个自身长度的偏移量);
3.再计算*p2:对p2的拷贝上执行解引用;
4.再计算p1++,产生对p1的一份拷贝,
5.++操作符增加p1的值(将指针p1向后移动1个自身长度的偏移量);
6.再计算*p1:对p1的拷贝上执行解引用;
7.最后将第3步所得结果赋到第6步中的内存,即*p1=*p2;
简单理解: 先 *p1 = *p2; 后 p1 + 1,p2 + 1
注:
1、左值和右值
左值表位置,其意思是这个量标示了一个特定的位置。可作左值的有变量、下标引用、解引用指针(已初始化的指针)。
右值表一个值,要求指定一个值。
2、前缀后缀问题
++a 等价于 a =a+1; return a;
a++ 等价于 int temp; temp = a; a= a+1; return temp; (temp是个临时变量)
附:运算符优先级表