全站搜索未启用
跳到主要内容

文本三:指针运算

赋值、取地址、间接访问、增1、减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;

2.取地址运算(&)

单目运算,使用在变量名的前面,表示取变量的地址。

(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')的地址。

3.间接访问运算(*)

单目运算符,在指针前面使用,能够访问到指针所指向的对象。

(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

4.指针增1(++)和减1(--)运算

单目运算符,可使用在指针变量的前面或后面,使指针变量的值增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都是移动一个元素位置,而不是一个字节位置。

5.指针加(+)和减(-)运算

它们都是双目运算符,一个指针加上或减去一个整数,得到的运算结果是一个指针,它向后或向前移动了若干个数据元素的位置。

(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],即数组后面的一个数据元素位置

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'

7.指针比较运算(==,!=,<,<=,>,>=) 

都是双目运算,比较左右两个指针的大小。数组中后面元素的地址大于前面元素的地址,即&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);//从后向前依次输出

最后修改: 2019年09月26日 Thursday 18:59