首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

NULL与零是否有区别?

2012-10-18 
NULL与0是否有区别??最近看到几个帖子,都喜欢这样定义C/C++ code#define NULL 0我表示不是很理解,按道理来

NULL与0是否有区别??
最近看到几个帖子,都喜欢这样定义

C/C++ code
#define NULL 0

我表示不是很理解,按道理来说,NULL 和 0 没区别啊,何必多此一举呢,求大佬能否详解一样NULL 和 0 的
差异!

[解决办法]
意义不同,NULL表示指针为空的宏,0是没有任何特殊含义的值。也就是说,理论上来讲NULL可以是任意数值,虽然目前所有编译器都将其设为0。
[解决办法]
比如说window api常用的宏就有INVALID_HANDLE_VALUE,这个宏的值是-1。

再举个坑爹的例子,Berkeley DB的一个宏DB_NOT_FOUND在4.5和4.8版的值就不一样,用宏来判断可以保证宏的值修改后能比较容易地重新编译。
[解决办法]
一楼说的是,虽然编译器在数值处理上是一致的,但为了提高程序的可读性及方便移植 还是应该区分好
比如
 char *ptr=NULL
 char a='\0';
 char b=0;

[解决办法]
探讨

引用:
意义不同,NULL表示指针为空的宏,0是没有任何特殊含义的值。也就是说,理论上来讲NULL可以是任意数值,虽然目前所有编译器都将其设为0。

如你所说的话,NULL 是指针为空C/C++ code
char *p=NULL;

那这样的代码,是说明p指向为空,这为空是个什么概念,指向的到底是什么地址???

[解决办法]
NULL 只需要保证不是任何有效地址即可 0 是一种无效地址 还有其他的无效地址 
NULL不保证实现为 0
[解决办法]
这篇文章很清晰的解释了你的问题
http://wenku.baidu.com/view/250567c08bd63186bcebbcc0.html
[解决办法]
指针的数值是其所指向的内存的地址
很多时候我们需要标明“这个指针当前为无效指针,它不指向任何可以使用的内存空间”,因为不能在指针外附加一个标志位,所以就需要设定一个特别的值,当指针的数值是这个值时,我们就认为这个指针当前是无效指针
因为内存从0开始的一段区域正常情况下是不允许读写的,所以我们规定,“当指针数值为0时,也就是它指向内存地址0时,这个指针就是不正常的指针,也就是我们所要声明的“该指针当前无效””。
为了明示这个意义,通常使用#define NULL 0语句来将指针与NULL比较

如果你觉得这是多此一举,那大多数#define都是多此一举
程序可读性大大提高,这个意义很重要

顺便说一句,部分程序员认为,这种做法也只是权宜之计,最新的C/C++标准似乎就专门在语言中定义了一个“无效指针”,而不是用0代替
没有什么必然性逻辑性,这就是一种规定,理解要执行,不理解也要执行,不执行你就和其他程序员没有共同语言,在你一个人的世界里执行你自己的逻辑
[解决办法]
探讨

引用:
意义不同,NULL表示指针为空的宏,0是没有任何特殊含义的值。也就是说,理论上来讲NULL可以是任意数值,虽然目前所有编译器都将其设为0。

如你所说的话,NULL 是指针为空C/C++ code
char *p=NULL;

那这样的代码,是说明p指向为空,这为空是个什么概念,指向的到底是什么地址???

[解决办法]
指针为空就是初始化的概念吧,那一句#define NULL 0,是为了让程序的可读性更高
[解决办法]
探讨
指针为空就是初始化的概念吧,那一句#define NULL 0,是为了让程序的可读性更高

[解决办法]
有区别,NULL可以说是一个抽象,而0是一个具体。NULL可以作为空指针使用,而0是一个int型的常量。
[解决办法]
为了提高程序的可读性和可移植性,

#define NULL 0

比如说由于其他需要,你改为了#define NULL -1,

那么你只需要改这一个地方就可以了,不需要把你用到0的地方都改为-1

个人理解。。。
[解决办法]
总得来说,其实是基于具体平台的一种合适的约定:
1、意义不一样,NULL表示的是无效地址,而0是这个无效地址的一个实现;
2、NULL放在0这个地址比较常用,但是对某些硬件体系来说,这样并不方便,会浪费一个宝贵的第0页RAM空间,所以让它指向另外的地址会更加合理,比如#define NULL 0xff这样的定义。

探讨

引用:
意义不同,NULL表示指针为空的宏,0是没有任何特殊含义的值。也就是说,理论上来讲NULL可以是任意数值,虽然目前所有编译器都将其设为0。

如你所说的话,NULL 是指针为空C/C++ code
char *p=NULL;

那这样的代码,是说明p指向为空,这为空是个什么概念,指向的到底是什么地址???

[解决办法]
探讨

总得来说,其实是基于具体平台的一种合适的约定:
1、意义不一样,NULL表示的是无效地址,而0是这个无效地址的一个实现;


2、NULL放在0这个地址比较常用,但是对某些硬件体系来说,这样并不方便,会浪费一个宝贵的第0页RAM空间,所以让它指向另外的地址会更加合理,比如#define NULL 0xff这样的定义。

引用:

引用:
意义不同,N……


[解决办法]
无效地址不过是某个实现中的实例表现,而非NULL的抽象语义。
[解决办法]
NULL表示的是无效地址。
[解决办法]
探讨

这篇文章很清晰的解释了你的问题
http://wenku.baidu.com/view/250567c08bd63186bcebbcc0.html

[解决办法]
一.NULL字符
  在ASCII码的第一个字符是NULL,它的数值是0,占用1字节;C语言把它作为字符串的最后一个字符,以表示字符串到此结束."\0"
二.NULL指针
  在C语言的头文件stddef.h中,NULL的定义如下:
  #ifndef NULL
  #ifdef __cplusplus
  #define NULL 0
  #else
  #define NULL ((void *)0)
  #endif
  #endif
  #interface NULL 0
  可见,NULL指针是一个无类型指针,并且值为0。一个指针,拥有2个属性--地址值和指针类型。两者的作用是:1,地址值标识变量的首地址(32位系统下指针的地址值占4字节);2,指针类型告诉编译器,应该怎样进行接下来的数据访问(int型数组和float型数组是不同的;数组访问与结构体访问也是不同的;等等)。
  NULL的出现是一种约定俗成,事实上它不是C语言中的关键字;把一个指针赋值为NULL,通常的说法是“将指针悬空”。这样,指针就无法再进行任何数据访问了。编程工作中有一类比较容易犯的错误--指针地址未进行正确的更新赋值就加以使用,这往往会造成很严重的后果(对内存区进行错误的涂抹)。所以一个良好的习惯是,当一个指针的工作稍事休息,先把它赋值为NULL,待到再度使用时,重新对其赋值以及进行指针类型转化。
  前面说到“NULL指针无法再进行任何数据访问”,其实是视编译器功能而定的。0位置指向的是程序起始,对于不同的编译器,NULL指针的操作结果是不同的:有些是不准读写,有些是只读,甚至读写都允许。编译器是人定的。引用网友win_hate在话题“关于NULL的不严谨”中的话来说:“如果说有谁不严谨了,那必定是读取0位置的程序员,而不是C。C的设计哲学之一是:‘程序员知道自己在干什么--没有安全带’”。
[解决办法]
就是一个视觉差异,看到 NULL,你会知道代码里其实是想要一个空指针,而不是一个整数0.
[解决办法]
内容一样,意义不一样。

热点排行