NULL与零是否有区别?

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是这个无效地址的一个实现;