5.2.4 指针变量的运算

指针变量可以进行一些运算,例如赋值运算、加减算术运算以及关系运算。关于赋值运算,前面已经介绍过,这里就不再重复了。

算术运算以及关系运算是针对数组型指针变量而言的,对于其他类型指针变量作加减算术运算以及关系运算毫无意义。由于指针变量本身的特殊性,只有指向同一数组的两个指针变量之间才能进行运算,否则运算无意义。下面就分别介绍数组型指针变量在关系运算和加减算术运算中的使用。

1.关系运算

对于指向同一数组的两指针变量进行关系运算,可用来表示它们所指向数组元素之间的地址关系。例如,两个指针变量p和q指向同一数组,则<、>、>=、<=、==等关系运算符都能使用。

❑若p==q为真,则表示p和q指向数组中的同一数组元素。

❑若p<q为真,则表示p指向数组元素处于低地址位置,q指向数组元素处于高地址位置,即p指向数组元素在q指向数组元素之前。

❑若p>q为真,则表示p指向数组元素处于高地址位置,q指向数组元素处于低地址位置,即p指向数组元素在q指向数组元素之后。

另外,当指针变量未赋值时,系统自动为其赋值为NULL,即为空指针,它不指向任何变量。此时的指针变量可以与0比较。例如,定义p为指针变量,则若p==0为真,表示p是空指针,它不指向任何变量;若p!=0为真,表示p不是空指针。

2.算术运算

指针变量进行算术运算,包括指针变量和整数进行加减运算以及指针变量之间进行减法运算。要注意的是,两个指针变量之间不能进行加法运算,毫无实际意义。

❑指针变量和整数进行加减运算

指针变量和整数之间可以进行加减运算。例如,假设p是指向数组a的指针变量,起始时p指向数组的某个元素a[m],设n为一正整数,则下面的运算是合法的。

➣p+n,指针变量指向的位置向后移动n个,即p指向a[m+n]。

➣p-n,指针变量指向的位置向前移动n个,即p指向a[m-n]。

➣p++,指针变量指向的位置向后移动1个,即p指向a[m+1]。

➣++p,先取指针变量的当前位置,然后将指针变量指向的位置向后移动1个,即p指向a[m+1]。

➣p—,指针变量指向的位置向前移动1个,即p指向a[m-1]。

➣—p,先取指针变量的当前位置,然后将指针变量指向的位置向前移动1个,即p指向a[m-1]。

指针变量进行算术运算,并不等同于将所指向的地址值进行算术运算。例如,将数组型指针变量向前或向后移动一个位置,和所指向的地址值加1或减1是不同的。不同类型的数组其数组元素所占的字节长度是不同的。因此,如果指针变量加1,即向后移动1个位置,表示指针变量指向下一个数组元素的首地址,而不是在原地址基础上加1。

不论指针变量指向何种数据类型,指针变量和整数进行加减运算时,编译程序会自动根据所指对象的长度对n进行放大,在一般编译系统中,char放大因子为1,int、short放大因子为2,long和float放大因子为4,double放大因子为8。这一原则对于下面要介绍的结构或联合也适用。

❑指针变量之间进行减法运算

两个指向同一数组的指针变量在一定条件下,可进行减法运算。其相减的结果遵守对象类型的字节长度进行缩小的规则。两指针变量相减所得之差是两个指针所指向的数组元素间相差的元素个数,实际上是两个数组元素的地址值之差再除以该数组元素的长度(字节数)。

例如,p和q是指向同一整型数组的两个指针变量,设p的值为3020H,q的值为3000H,而整型数组每个数组元素占两个字节,所以p-q的结果为(3020H-3000H)/2=10,表示p和q间相差10个元素。