空指针NULL


在C语言中,如果一个指针不指向任何数据,我们就称之为 空指针 ,用

NULL

表示。例如:

int *p = NULL;


注意区分大小写,null 没有任何特殊含义,只是一个普通的标识符。


NULL 是一个宏定义,在

stdio.h

被定义为:

#define NULL ((void *)0)


(void *)0表示把数值 0 强制转换为void *类型,最外层的( )把宏定义的内容括起来,我们自己进行宏定义时也推荐这么做,防止发生歧义。


总之,p 的值为 0。你可以输出 p 的值:

#include <stdio.h>
int main()
{
         int *p = NULL; 

         printf("%d\n", p); 

         return 0; 

}

运行结果:
0

我们知道,变量一旦定义就要分配内存,指针变量也是如此。例如:


int *p; //它不是空指针


它的值是随机的,是垃圾值,如果不小心使用了它,运行时一般会引起段错误,导致程序退出,甚至会不知不觉地修改数据.

p 经过定义,就一定在内存中分配了4个字节(32位环境)的空间,只是它的值是随机的,不像int会被初始化为 0,但是它确实指向了一段正常使用的内存。使用 p 时,操作的就是这段内存的数据,幸运的话能够正常运行,不过大部分情况下这段内存是无权操作的。

下面的写法也是不专业的:


int *p = 0;


而应该坚持写为:

int *p = NULL;



void 指针


C语言还有一种

void

指针类型,即可以定义一个指针变量,但不说明它指向哪一种类型数据。例如:


void *p = malloc(2);


在内存中分配2个字节的空间,但不确定它保存什么类型的数据。

注意,void 指针与空指针 NULL 不同:NULL 说明指针不指向任何数据,是“空的”;而 void 指针实实在在地指向一块内存,只是不知道这块内存中是什么类型的数据。