7.5.2 关系运算
指针之间除了可以进行减运算外,还可以进行关系运算。指针的关系运算是比较地址间的关系,这包括两方面:一方面是判断指针是否为空,另一方面是比较指针的相对位置。进行关系运算的两个指针必须具有相同的类型。有相同类型的两个指针p1和p2,则p1和p2间的关系运算式如下所示。
p1==p2:判断p1和p2是否指向同一个内存地址;
p1>p2:判断p1是否处于比p2高的高地址内存位置;
p1>=p2:判断p1是否处于不低于p2的内存位置;
p1<p2:判断p1是否处于比p2低的低地址内存位置;
p1<=p2:判断p1是否处于不高于p2的内存位置。
以上5种是判断两个指针之间的比较,下面两种是判断指针是否为空。
p1==0:判断p1是否是空指针,即什么都不指;
p1==NULL:含义同上;
p1!=0:判断p1是否不是空指针,即指向某个特定地址;
p1!=NULL:含义同上。
注意:C++(www.cppentry.com)标准中并没有规定空指针必须指向内存中的什么地方,具体用什么地址值来表示空指针取决于系统的实现。因此,NULL并不总等于0。这就存在了零空指针和非零空指针两种,但是C++(www.cppentry.com)倾向于使用零空指针。
上述4种都是判断指针与空指针之间的关系,这在通过指针遍历链表、数组等连续内存单元时很有用,可以作为遍历终止的条件。
【示例7-14】 演示指针的关系运算。
- int main()
- {
- int *pInt1;
- int *pInt2;
-
- pInt1=new int[5];
- cout<<"pInt1 : "<<pInt1<<endl;
- pInt2=pInt1;
- cout<<"pInt2 : "<<pInt2<<endl;
-
- cout<<"pInt1==pInt2 : "<<(pInt2==pInt1)<<endl;
- cout<<"pInt1>pInt2 : "<<(pInt2>pInt1)<<endl;
-
- pInt2++;
- cout<<"pInt2 : "<<pInt2<<endl;
-
- cout<<"pInt1==pInt2 : "<<(pInt2==pInt1)<<endl;
- cout<<"pInt2>pInt1 : "<<(pInt2>pInt1)<<endl;
- cout<<"pInt2==NULL : "<<(pInt2==NULL)<<endl;
-
- delete[] pInt1;
-
- pIn1=0;
- pInt2=0;
- return 0;
- }
该示例可能的输出如下所示。
- pInt1 : 0x3e3f70
- pInt2 : 0x3e3f70
- pInt1==pInt2 : 1
- pInt1>pInt2 : 0
- pInt2 : 0x3e3f74
- pInt1==pInt2 : 0
- pInt2>pInt1 : 1
- pInt1==NULL : 0
分析:该示例定义了两个整型指针变量pInt1和pInt2,用new运算符给pInt1分配了可存放5个整型数据的内存单元。申请时使用了do…while循环,循环的出口条件是"pInt1==0"。这表示通过判断pInt1是否为空,从而判断是否成功申请到内存空间。如果为空,表明申请失败,继续申请,直至申请成功为止。申请成功后,将pInt1的值赋给了pInt2,从输出结果可看出,两者指向了同一个内存单元。因此,判等运算输出为1,判断pInt1是否地址比pInt2高输出0。
接下来,pInt2移动了一个位置,从输出可以看出,地址增加了4个字节,恰是一个int型数据的长度。然后再次对pInt1和pInt2判等,显然两者不等,故输出0。但显然pInt2在比pInt1高的位置上,故下一个比较输出了1。最后判断pInt1是否是空指针,输出0。
【责任编辑:
云霞 TEL:(010)68476606】