
赋值、取地址、间接访问、增1、减1等
双目运算,把赋值号右边的指针(地址)值赋给左边的同类型的指针变量。
(1) int x=30, *px, *py=NULL;
(2) px=&x;
(3) py=px;
(4) int y=3*x+1;
(5) py=&y;
(6) x=x+12;
单目运算,使用在变量名的前面,表示取变量的地址。
(1) char ch= '+', *p=&ch;
//ch的地址&ch赋给p,p指向ch。
(2) char s[30]="Apple", *ps=s;//s前不用加&符号
//字符数组s的地址,即s[0]元素的地址赋给ps
//ps指向s数组,s和ps的值均为s[0]元素(值为'A')的地址。
单目运算符,在指针前面使用,能够访问到指针所指向的对象。
(1) int x=12, *px=&x;
(2) printf("%d\n",*px+10);//x+10=22
(3) *px+=15;//x+=15,*px即x的值变为27
//*px出现的情况不同,其含义也完全不同,要注意区分
(4) int *ptr, a1=20**px;//20**px=20*27=540
&和*是互为逆运算,*&x等同于x,&*p等同于p
单目运算符,可使用在指针变量的前面或后面,使指针变量的值增1或减1。
(1) int a[5]={10,15,20,25,30}, x,y;
(2) int *p=a;// p的值为&a[0],p指向数组 a
(3) x=*p++;//x=10,p->a[1]
(4) x=*++p;//x=20,p->a[2]
(5) y=(*p)++;//y=20,a[2]=21
(6) p--;//前p->a[2],后p->a[1]
(7) printf("%d\n", *p--);//输出15
(8) p=&a[3];
(9) printf("%d\n",--*p);//输出24
注意: p++、++p、p--、--p都是移动一个元素位置,而不是一个字节位置。
它们都是双目运算符,一个指针加上或减去一个整数,得到的运算结果是一个指针,它向后或向前移动了若干个数据元素的位置。
(1) int b[6]={1, 3, 5, 7, 9, 11};
(2) int *p=b, *q=p+5;// q->b[5]
(3) printf("%d\n", *(q-3));//输出5
(4) p=b+6;//p指向b[6],即数组后面的一个数据元素位置
它们都是双目运算符,+=或-=左边的指针变量被加上或减去右边的整数值。
(1) char a[20]="wbcdefghi";
(2) char *p=a;// p->a[0]
(3) p+=7;//p->'h'
(4) p-=4;//p->'d'
(5) *p-=3;//运算后a[3]='a'
都是双目运算,比较左右两个指针的大小。数组中后面元素的地址大于前面元素的地址,即&a[i+1]>&a[i]。
(1) int a[5]={20,15,32,48,46};
(2) int *p;
(3) for(p=a; p<a+5; p++) printf("%d ", *p);//依次输出元素值
(4) for(p=a+4; p>=a; p--) printf("%d ", *p);//从后向前依次输出