在C 语言中,指针也能进行自加、自减运算以及与整数做加减运即让指针变量加、减1或者加上一个整数、减一个整数都是合法的运算。
指针运算与整数的运算并不相同,指针变量运算的时候,表示了数据的移动。
float X ,*pf=&x ;
假设变量X 的地址为4 0 0 0 H , pf+5所表示的地址值为4000H+5*4=4014H 因此表示了当前地址开始往后移动了5 个元素。
指针的自加,利用数组分配连续的存储空间, 设数组的存储地址是从ff00 开始的,令 P 保存数组a 中元素a[1]的地址,则执行运算P++以后,指针后移一个元素,那么 P 的值为ff04。
同样,如执行P + 2 ,则在当前位置后移一个元素。要想在指针运算的同时取出数组中相应地址中的元素, 有下面的规则:
-
*p++相当于 *(p++), 若P的当前值为ff02 ,后缀自加表达式的值为ff02, 利用指向运算符得到此地址指向的数据为5 , 当前指针P 的值为ff04。 由于后++优先级高于*,应该先p++,后取值,但因为是后++,所以先执行*p,然后等赋值完成以后,p再++
-
(*p)++ 相当于对P指向的数据进自增运算, 若P指向数组中a [1] , 那么表达式相当于a [ l]++ , a[l]的值为6。
-
*++p相当于 *(++p) ,若P指向数据元素a[l],那么前缀自加加表达式的值为ff04, 取出当前的元素9 , 此时P的值力ff04。
int main() {
int a[5],i;
int *p; /*定义一个整型指针变量p*/
for (i=0;i<5;i++)
a[i]=i+2;
p=&a[1]; /*将数组a[1]的地址赋值给p*/
printf("the address %x,the data is %d.\n",p,*p);
p++; /*指针下移*/
printf("the address %x,the data is %d.\n",p,*p);
p=&a[1]; /*重新将p指向a[1]*/
printf("the address %x,the data is %d.\n",p,*p++);
p=&a[1];
printf("the address %x,the data is %d.\n",p,*++p);
return 1;
}