9.11 指向虚无的指针
C语言中有一种数据类型是“void”类型,这种类型的特点就是没有任何值。
与这种类型相对应,C语言中还有一种“void*”类型的指针,这种指针不指向任何类型的内存对象,但具有一个值,这个值当然也是地址。只有对于这种类型的指针,说“指针就是地址”才是一种恰当的说法。对于其他类型说“指针就是地址”显然是掩盖了指针更为本质、更为重要的内涵——指针所指向的数据对象或函数的类型。
作为一种只有值而没有更多含义的“void”类型的指针,其作用仅仅在于传递、保存这个值。“void”类型的指针可以参加赋值运算(包括作为函数的参数)和类型转换运算,除此之外,“void”类型的指针不可以进行其他任何运算,甚至一元“”运算这种多数指针类型的基本运算也不可以。
但是“void”类型指针的最大优点在于,无论什么类型的指针赋值给“void”都不用类型转换,反之亦然。然而不少严谨的人士却并不领这个情,他们一如既往地、明白地写出这种转换,尽管他们知道这不是必须的。
在写函数定义时,可能并不清楚函数的调用者会提供什么样的指针,这时只能把对应的形参声明为“void”类型;同样也有可能不清楚函数调用者需要什么样的指针,这时也只能把函数的返回值声明为“void”类型。