一、问题
普通变量可以运算,那么指针可以吗?答案是肯定的。那么如何运算呢,下⾯就来介绍⼀下。
二、解答
我们知道可以利⽤指针⽅便地对数组元素进⾏⽐较和查找,那么这就需要对指针进⾏运算。
(1)⾃增/⾃减运算。
对于指针变量可以⾃增/⾃减运算,例如:
p++;
这样⼀句代码究竟有何意义呢?如果 p 是⼀个普通变量,那么它会根据类型不同⽽⾃增一个单位。那么指针变量呢,也是自增一个单位吗?这个单位又会是多少?
#include <stdio.h>
int main()
{int a = 0, *p;char b = 'a', *q;p = &a;q = &b;printf("指针p指向的地址值是:%d\n", p);printf("指针q指向的地址值是:%d\n\n", q);p++;q++;printf("指针自增一次后的地址值是:%d\n", p);printf("指针自增一次后的地址值是:%d\n", q);return 0;
}
运⾏结果如图所示。
指针p指向的地址值是:1804809432
指针q指向的地址值是:1804809423指针自增一次后的地址值是:1804809436
指针自增一次后的地址值是:1804809424
从图中可以看出,int 型的指针在⾃增⼀次后,其地址值增加了 4 ,⽽ char 型指针在⾃增⼀次后,其地址值增加了 1 。我们知道,C语⾔中 int 型数据占 4 个字节的内存单元,⽽ char 型占1 个字节的内存单元。这就不难得出,指针的⾃增和⾃减⼀次,就是指针指向的地址值⾃增或⾃减相对应数据类型所占内存单元的字节数。
这也就是前⾯提到为什么说在定义指针变量时,指针的类型⾮常重要。若使⽤类型不匹配的指针变量,将得到不可预测的结果。
(2)指针加减⼀个整数。
指针还可以加减⼀个整数,那么如何操作呢?例如(int 型的指针 p,p初始指向地址为 10000):
p+=3;
与指针⾃增/⾃减相似,这时指针变量 p 并不是将内存单元增加 3 个字节,⽽是增加 3 个基类数据的字节宽度,也就是相当如下的语句。
p = p + 3 * sizeof(*p)
即:10000+3*4 = 100012 指针减去⼀个整数与增加类似。
(3)两个指针变量相减。
指针变量保存的是内存地址,所以将两个指针变量相加是没有意义的。于是,不允许将两个指针变量直接相加,但是允许两个指针相减。
那么两个指针相减得到什么呢?其实,通过上⾯的内容⼰经不难得出答案,那就是两个指针相减得 到的是两个指针之间相差的内存单元数,如果再除以与指针类型相对的数据类型宽度,就 会得到两个变量相隔多少个数据类型位置。如果是数据,就可以得到两个元素之间相隔⼏个元素。
其实对于指针的加减⼀个整数和两个指针变量相减,这些对于与它们相关的普通变量意义不⼤,这些主要⽤于后⾯要说的指针操作数组。
(4)指针⽐较。
指针⽐较是为了判断两个指针在内存中的关系。例如:
p1>p2如果返回值为 true,则表示 p1 在内存中处于⾼位地址。p1==p2如果返回值为 true,则说明这两个指针指向同⼀地址值。还有⼀个就是判断地址值是否为空,即:p==NULL 如果返回值为 true,则说明 p 指针为空。
三、总结
对于指针运算,要注意的是指针只可以加减⼀个整数,其他任何算术运算都是⾮法的。 这⼀点必须谨记,否则会造成不可预料的错误和后果。