有两种类型的指针运算符。
地址获取运算符() :地址获取运算符)是单眼运算符,其耦合性为从右到左,其功能是获取变量的地址。 在scanf函数和上述指针变量赋值中,理解并使用了运算符。
内容运算符(* ) :内容运算符) * )是单眼运算符,连接性从右到左,表示指针变量指向的变量。 *运算符后的变量必须是指针变量。
请注意,指针运算符(* )和指针变量说明中的指针描述符(* )不同。 在指针变量的说明中,“*”是类型说明符,表示后面的变量是指针类型。 表达式中的“*”是表示指针变量所指变量的运算符。
【例10-6】
1main(2)2 {3 int a=5,*p=a; 4printf('%d ',*p ); 5 }
指示指针变量p已获取整数变量a的地址。 printf('%d”,*p )语句表示输出变量a的值。
赋值运算
指针变量的代入运算有以下形式。
1 )关于指针变量的初始化赋值,已经进行了说明。
2 )对指向同一数据类型的指针变量赋予1个变量的地址。 例如:
int a,*pa;
pa=a; /*整数类型指针变量pa*/
3 )向指向同一类型变量的另一个指针变量赋予一个指针变量的值。 例如:
int a,*pa=a,*pb;
pb=pa; /*指针变量pb*/
pa、pb都是整数变量的指针变量,因此可以相互赋值。
4 )将数组的起始地址赋予数组的指针变量。 例如:
int a[5],*pa;
pa=a; /*数组名称表示数组的起始地址,因此指向数组的指针变量pa */
也可以写如下
pa=a[0]; /*数组中第一个元素的地址也是整个数组的第一个地址,pa*/
当然,也有初始化赋值的方法。
int a[5],*pa=a;
5 )将字符串的起始地址赋予字符类型的指针变量。 例如:
char *pc;
电脑=' c语言';
或者用初始化赋值的方法写如下。
char * PC=' c语言';
应该说明的是,不是将整个字符串放入指针变量中,而是将存储字符串的字符数组的起始地址放入指针变量中。 稍后详细介绍。
6 )向函数的指针变量提供函数的入口地址。 例如:
int(*pf ) );
pf=f; /*f是函数名*/
加减法
指向数组的指针变量可以加上或减去整数n。 如果将pa作为数组a的指针变量,则pa n、pa-n、pa、pa、pa----pa运算都是合法的。 在指针变量中添加或减去整数n的含义是将指针指向的当前位置(指向数组元素)向前或向后移动n个位置。 请注意,向前或向后移动一个数组指针变量与向地址加或减1在概念上是不同的。 因为数组有不同的类型,每个类型的数组元素所占的字节长度不同。 将指针变量加1会将指针变量指向下一个数据元素的起始地址的位置向后移动一个位置。 不是在原来的地址上加1。 例如:
int a[5],*pa;
pa=a; /*pa指数组a,a[0]*/
pa=pa 2; /*pa指的是a[2]。 也就是说,pa的值为pa[2]*/
指针变量的加减运算只能对数组指针变量进行,对其他类型变量的指针变量的加减运算是无意义的。
两个指针变量之间的运算
只能在指向同一数组的两个指针变量之间进行运算,否则运算没有意义。
1 )减去两个指针变量
减去两个指针变量后的差是两个指针所具有的指数组元素之间的差的元素数。 实际上,是两个指针值(地址)的减法差除以数组元素的长度(字节数)。 例如,pf1和pf2是指向同一浮点数组的两个指针变量,将pf1的值设为2016H,将pf2的值设为2000H,由于浮点数组每个元素占用4个字节,因此pf1-pf2的结果为[ 2016 h-2000 ] 两个指针变量不能相加。 例如,pf1 pf2是什么意思呢? 没有实际意义。
2 )基于两指针变量的关系运算
对指向同一数组的两个指针变量进行关系运算,可以表示这些指数组要素之间的关系。 例如:
pf1==pf2表示pf1和pf2指向同一个数组元素。
pf1pf2表示pf1位于高地址位置;
pf1
也可以将指针变量与0进行比较。 如果将p作为指针变量,则p==0表示p为空指针且未指向任何变量。 p!=0表示p不是空指针。
null指针是通过将指针变量赋予0的值获得的。 例如:
#define NULL 0
int *p=NULL;
将0值代入指针变量和不代入指针变量是不同的。 指针改变
量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。【例10-7】
1 main()2 {3 int a=10,b=20,s,t,*pa,*pb; /*说明pa,pb为整型指针变量*/
4 pa=&a; /*给指针变量pa赋值,pa指向变量a*/
5 pb=&b; /*给指针变量pb赋值,pb指向变量b*/
6 s=*pa+*pb; /*求a+b之和,(*pa就是a,*pb就是b)*/
7 t=*pa**pb; /*本行是求a*b之积*/
8 printf("a=%dnb=%dna+b=%dna*b=%dn",a,b,a+b,a*b);9 printf("s=%dnt=%dn",s,t);10 }
【例10-8】
1 main()2 {3 int a,b,c,*pmax,*pmin; /*pmax,pmin为整型指针变量*/
4 printf("input three numbers:n"); /*输入提示*/
5 scanf("%d%d%d",&a,&b,&c); /*输入三个数字*/
6 if(a>b) /*如果第一个数字大于第二个数字...*/
7 {8 pmax=&a; /*指针变量赋值*/
9 pmin=&b;10 }11 else
12 {13 pmax=&b; /*指针变量赋值*/
14 pmin=&a;15 }16 if(c>*pmax) /*判断并赋值*/
17 pmax=&c;18 if(c
19 pmin=&c;20 printf("max=%dnmin=%dn",*pmax,*pmin); /*输出结果*/
21 }