指针的地址计算包括以下几个方面的内容。
(1)赋初值
指针变量的初值可以是NULL(0),也可以是变量、数组、结构以及函数等的地址。例如:
(2)指针与整数的加减
指针可以与一个整数或整数表达式进行加减运算,从而获得该指针当前所指位置前面或后面某个数据的地址。假设p为一个指针变量,n为一个整数,则p±n表示离指针p当前位置的前面或后面第n个数据的地址。
(3)指针与指针相减
指针与指针相减的结果为一整数值,但它并不是地址,而是表示两个指针之间的距离或元素的个数。注意,这两个指针必须指向同一类型的数据。
(4)指针与指针的比较
指向同一类型数据的两个指针可以进行比较运算,获得两个指针所指地址的大小关系。
此外,在计算指针地址的同时,还可进行间接取值运算。不过在这种情况下,间接取值的地址应该是地址计算后的结果,并且还必须注意运算符的优先级和结合规则。设p1、p2都是指针,对于
a=*p1++;
由于运算符*和++具有相同的优先级而指针运算具有右结合性,按右结合规则,有++、*的运算次序,而运算符++在p1的后面,因此上述赋值运算的过程是首先将指针p1所指的内容赋值给变量a,然后p1再指向下一个数据,表明是地址增加而不是内容增加。对于
a=*-p1;
与上例相同,按右结合规则有--、*的运算次序,而运算符--在p1 的前面,因此首先将p1减去1,即指向前面一个数据,然后再把p1此时所指的内容赋值给变量a。对于
a=(*p2)++;
由于使用括号()使结合次序变为*、++,因此首先将 p2 所指的内容赋值给变量 a,然后再把p2所指的内容加1,表明是内容增加而不是地址增加。
例2-45 指针运算的例子。
程序执行结果:
例2-46 两指针相减——计算字符串长度的函数。
程序执行结果:
lenth of'abcdef'=6
需要指出的是,指针的运算是很有限的,它只能进行如上所述的四种运算操作,除此之外所有其他指针运算都是非法的。特别强调一点,不允许对两个指针进行加、乘、除、移位或屏蔽运算,也不允许用float类型数据与指针做加减运算。