指针有算术运算和关系运算,只有当指针是指向数组元素时,这些运算才有意义。
一、算术运算
1、指针变量与整型变量n的加减表示移动指针
新指针值=原指针值+n*sizeof(指针指向的数据类型)
说明:(1)当一个指针与一个整数量执行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整。这个"合适的大小“就是指针所指向类型的大小,”调整“就是把整数值和”合适的大小"相乘。比如,float占四个字节,在计算float型指针加3的表达式时,实际加到指针上的整型值为12。
(2)运算结果并不表明此处有一个数组元素,称作不对数组边界进行检查。
#include "stdafx.h"
#include <stdlib.h>
#define N_VALUES 5
float values[N_VALUES];
float *vp;
int _tmain(int argc, _TCHAR* argv[])
{
for (vp=&values[0];vp<&values[N_VALUES];)
*vp++=0;
system("pause");
return 0;
}
经过5次循环后,vp就指向数组最后一个元素后面的那个内存位置。此时未对vp执行间接访问操作,所以它是安全的。使用!=操作符代替<操作符也是可行的。
考虑下面这段循环
for (vp=&values[N_VALUES];<span style="font-family: Arial, Helvetica, sans-serif;">vp>&values[0]</span>)
*--vp=0;
让vp指向数组最后一个元素后面的内存位置,但在对它进行间接访问前先执行自减操作。当vp指向数组第1个元素时,循环便告终止。
2、指针— 指针
只有当两个同类型的指针变量指向同一个数组时才可以进行减法运算,结果表示由第1个指针所指元素到第2个指针所指元素间的元素数量。
如数组中元素的类型为float,每个元素占4个字节的内存空间。如果数组的起始位置为1000,p1的值是1004,p2的值是1024,但表达式p2-p1的结果为5,因为两个指针的差值20将除以每个元素的长度4。
二、关系运算
1、当且仅当两个同类型指针变量指向同一数组中的元素时,可以用关系运算符“〉”、“==”、“!=”等进行比较,比较规则是指向后面元素的指针大,指向同一元素的指针相等。
注意:两个指针相加是毫无意义的。例如p1和p2指向同一数组中两个不同的元素,这两个元素间有一个元素,要找出中间元素的首地址,即要建立两个指针间的指针,不能写成p=(p1+p2)/2,必须写成p=p1+(p2-p1)/2。
2、指针进行"++"、"--“运算
y=*pfib++;
由于++的优先级高于”*“,所以该表达式等效于y=*(pfib++),y取值*pfib,而pfib增1后指向下一个元素。