2.3.2 指针(3)
任何非0指针对应的条件值都是true。
对于两个类型相同的合法指针,可以用相等操作符(==)或不相等操作符(!=)来比较它们,比较的结果是布尔类型。如果两个指针存放的地址值相同,则它们相等;反之它们不相等。这里两个指针存放的地址值相同(两个指针相等)有三种可能:它们都为空、都指向同一个对象,或者都指向了同一个对象的下一地址。需要注意的是,一个指针指向某对象,同时另一个指针指向另外对象的下一地址,此时也有可能出现这两个指针值相同的情况,即指针相等。
因为上述操作要用到指针的值,所以不论是作为条件出现还是参与比较运算,都必须使用合法指针,使用非法指针作为条件或进行比较都会引发不可预计的后果。
3.5.3节(第117页)将介绍更多关于指针的操作。
void* 指针
void*是一种特殊的指针类型,可用于存放任意对象的地址。一个void*指针存放着一个地址,这一点和其他指针类似。不同的是,我们对该地址中到底是个什么类型的对象并不了解:
- double obj = 3.14, *pd = &obj;
- // 正确:void*能存放任意类型对象的地址
- void *pv = &obj; // obj可以是任意类型的对象
- pv = pd; // pv可以存放任意类型的指针
利用void*指针能做的事儿比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋给另外一个void*指针。不能直接操作void*指针所指的对象,因为我们并不知道这个对象到底是什么类型,也就无法确定能在这个对象上做哪些操作。
概括说来,以void*的视角来看内存空间也就仅仅是内存空间,没办法访问内存空间中所存的对象,关于这点将在19.1.1节(第821页)有更详细的介绍,4.11.3节(第163页)将讲述获取void*指针所存地址的方法。
2.3.2节练习
练习2.18:编写代码分别更改指针的值以及指针所指对象的值。
练习2.19:说明指针和引用的主要区别。
练习2.20:请叙述下面这段代码的作用。
- int i = 42;
- int *p1 = &i;
- *p1 = *p1 * *p1;
练习2.21:请解释下述定义。在这些定义中有非法的吗?如果有,为什么?
- int i = 0;
(a) double* dp = &i; (b) int *ip = i; (c) int *p = &i;
练习2.22:假设p是一个int型指针,请说明下述代码的含义。
- if (p) // ...
- if (*p) // ...
练习2.23:给定指针p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路;如果不能,也请说明原因。
练习2.24:在下面这段代码中为什么p合法而lp非法?
- int i = 42; void *p = &i; long *lp = &i;