空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。空指针用0表示,C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西,使之不会因为未定义而指向了不该指的内存区域,而造成系统崩溃。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL. 程序里可以写 p = 0; 或者 p = NULL; 两种写法都把p置为空指针值。相对而言,前一种写法更容易使读程序的人意识到这里是一个指针赋值。
我们印象中C语言的指针都有类型,实际上也存在一种例外。这里涉及到通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。
int n=3, *p;
void *gp;
gp = &n;
p=(int *)gp1;
通用指针void*,抽象的无类型指针,void *可以指向任何类型的数据;其出现只是为了一种抽象的需要;因为现实数据都是有类型的。
通常,只有相同类型的指针才可以直接相互赋值;而void*则不同,任何类型的都可以直接赋值给它,如void *p1;int *p2;p1 = p2;不需强制类型转换;但这并不意味着void*可以任意直接赋值给其他类型如void *p1;int *p2;p2 = p1;(C编译器可能不报错,但C++中就必须强制转换),因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”;