1.(*p)++和*(p++)和*p++的区别:
总结:
前缀递增递减和*优先级相同,从右到左;
后缀递增递减比前缀优先级高,从左到右。
比如
1
2
|
int
arr[5] = { 1,3,5,7,9 };
int
*p = arr;
|
*++p:p先自+,然后*p,最终为3
++*p:先*p,即arr[0]=1,然后再++,最终为2
*p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
(*p)++:先*p,即arr[0]=1,然后1++,该语句执行完毕后arr[0] =2
*(p++):效果等同于*p++
例子:
#include "stdafx.h"
#include "stdio.h"
#include <stdlib.h>
int _tmain(int argc, _TCHAR* argv[])
{
int a[50]={0,0,0,0};
int *p;
p=a;
int k1,k2,k3;
//测试第一部分
printf("%d\n",p);
*p++=10;
printf("%d\n",p);
<span style="color:#ff0000;"> printf("%d\n",a[0]);//这里不用*p来读取数值是因为p的值已经改变,只好用a[0]来实现。</span>
printf("%d\n",a[1]);
//测试第二部分
int b[5]={1,2,3,4,5};
int *q;
q=b;
k1=*q++;
q=b;
k2=(*q)++;
q=b;
k3=*(q++);
printf("k1的值是%d\n",k1);
printf("k2的值是%d\n",k2);
printf("k3的值是%d\n",k3);
return 0;
}
实现的是将10赋值给*p后p在自增1,也就是使得a[0]的值为10,而不是a[1]的值为10;之后自增*(p++)指向a[1]
测试第二部分:
先将*q的值赋给k1,然后q值再自增,指向b[1];
|
先将*p的值赋给k2,然后*q值再自增,b[0]的值加1;
和1相同,但是因为b[0]的值加1了,所以k3为2 ;
区别指针在表达式的左侧还是右侧!