读书人

对NULL的疑惑,该怎么处理

发布时间: 2012-02-13 17:20:26 作者: rapoo

对NULL的疑惑
fopen()是打开文件的函数,其返回值是文件型指针,教材中提到当文件出错或文件不存在时,fopen()的返回值时NULL,对NULL,教材的解释时它代表空,值为零。
这里有几个疑问:其一,NULL代表空,这个空如何理解(不要字面解释,应将其用形象的空间想象图来描述,如此,才更易理解)?其二,NULL的值是零,这个零又是什么,十进制数吗?既已表示为空,为何又要表示成零?其三,NULL不是指针,既如此,又怎么是fopen()函数的一个返回值呢?

[解决办法]
NULL是系统定义的一个常量,值是十进制数零。printf( "%d\n ",NULL);结果输出就是0。

NULL所指的空是一个逻辑意义上的空,比如一个杯子没有装水,你可以说他是空的,但是确实是空的么,不是,里面还有空气啊,明白了么。

0的值只是一个指代,人们的习惯。或者说最初设计的时候就是这么定义下来了,比如1+1=2,为什么要得2呢,2是个什么东西呢,都是最开始人们的定义。你完全可以自己定义套规则,自己开发个编译器,把NULL常量的值设置为99999或77777,这都是没有问题的。

当指针指向NULL的时候,一般的意义是操作失败或者是终止。如果不管对错的话,指针是可以指向任何东西的,因为指针就是表示一个内存地址,指什么都可以啊,管他里面什么内容呢。当我们定义一个指针,还没有初始化的时候,他里面的数值是不一定的,这也就是“野指针”。当把指针指向NULL,就是把指针指向一个常量。
int *p;
p=NULL;
printf( "%d\n ",*p); //结果就是0
[解决办法]
呵呵。楼主扣得太细了。

从理论上,C和C++语言中的对象都是值语义的,不可能像Java语言中那样,定义一个真正的“null”指针值。
但是,C++语言也规定了,值为0的指针就能起到空指针的作用。
对此,C++语言还做了许多特别的规定,比如,一般的整数值,比如5,如果想换换成指针类型,是需要做reinterpret_cast的,而只有0这个值不用,可以直接赋给指针变量;再比如,delete一个值为0指针没有任何效果,是安全的;再比如,多继承中,从子类指针到父类指针的转换,如果指针原来已经是0值,那么将不再进行任何指针偏移,等等。
总而言之,值为0的指针在C和C++语言中是有特殊意义的,既不可等闲视之,也不可跟其它指针等同视之。

知道了0值指针的特殊性,那么理解你原来的问题应该就可以见怪不怪了:

> > 其一,NULL代表空,这个空如何理解(不要字面解释,应将其用形象的空间想象图来描述,如此,才更易理解)?
“空”就是由0值指针所代表的一种啥也不指向状态。而至于为啥用0代表这个“啥也不指向的状态”,而不用1或者其它的值,这个正如上面所说,是语言规定的。

其二,NULL的值是零,这个零又是什么,十进制数吗?既已表示为空,为何又要表示成零?
0就是0,指针变量保存的是个地址值,NULL指针所保存的那么地址的编号为0。

其三,NULL不是指针,既如此,又怎么是fopen()函数的一个返回值呢?
NULL是宏定义的一个指针常量,就是0,fopen在打开文件失败的时候,返回这个值来表示这种失败。换句话说,只要fopen返回的不是NULL,而是一个其它值(不管是多少,只要不是NULL),你都可放心大胆地把它作为一个有效的文件指针使用,唯独NULL不可以,不错,它是一个指针“值”,只可惜语言规定了等于这个值的指针除了报靠错误之类的,没啥大用。

读书人网 >C语言

热点推荐