指针只能用地址表达式表示,不能像普通整数那样对指针进行任意的运算。除单目的&和*运算外,指针所允许的运算还包括有限的算术运算和关系运算。
1.算术运算
指针的算术运算包括:指针加、减一个整数和两个指针相减运算及++、–运算。
(1)指针与整数的加减运算。
指针变量加上或减去一个整数n,是将指针由当前位置向前或向后移动n个数据的位置。通常这种运算用于将指针指向一个数组中的其他位置。
对于指向一般数据的指针变量,加减运算操作的作用并不大。由于各种类型的数据的存储长度不同,因此在数组中加减运算使指针移动n个数据后的的实际地址与数据类型有关。
例如,在Visual C++6.0编译环境中:
对于char型,对指针加1操作相当于当前地址加1个字节;
对于int型,对指针加1操作相当于当前地址加4个字节;
对于float型,对指针加1操作相当于当前地址加4个字节。
一般地,如果p是一个指针,n是一个正整数,则对指针p进行+n或-n操作后的实际地址是:
p+n乘以sizeof(数据类型)。其中,“sizeof(数据类型)”是取数据类型长度的运算符。
(2)自增、自减运算。指针变量自增、自减运算也是地址运算。指针加1运算后指针指向下一个数据的起始位置;指针减1运算后,指针指向上一个数据的起始位置。
指针自增、自减单目运算也分前置和后置运算,当它们与"*"运算符组成一个表达式时,两个单目运算符的优先级相同,其结合性为从右到左。
(3)两个指针相减运算。两个指针相减的运算只能在同一种指针类型中进行,他们主要应用于对数组的操作,其结果是一个整数而不是指针。例如,p1和p2是指向同一数组中的不同或相同元素的指针(p1小于或等于p2),则p2-p1的结果为p1和p2之间间隔元素的数目n。
例如,指针p1指向数组a[2],p2指向数组元素a[8];a[2]与a[8]之间隔6个元素,所以p2-p1的值为6。
2.关系运算
指针的关系运算表示它们所指向的地址之间的关系。两个指针应指向同一数组中的元素,否则运算结果无意义。指针间允许4种关系运算:
< 或 >:比较两指针所指向的地址的大、小关系。
==或!=:判断两指针是否指向同一地址,即是否指向同一数据。
例如,指针p1、p2指向数组中的第i、j元素,则下列表达式为真的含义为:
(1)p1<p2(或p2>p1)表示p1所指元素位于p2所指元素之前(或表示p1所指元素位于p2所指元素之后)。
(2)p1==p2表示p1和p2指向同一数组元素的地址。
指针不能与一般数值进行关系运算,但指针可以与零(NULL字符)之间进行等于或不等于的关系运算。例如:
p==0;p!=0;p=NULL;p!=NULL;
用于判断指针p是否为NULL指针。