NULL与0是否有区别??

manxiSafe 2012-10-09 09:44:16
最近看到几个帖子,都喜欢这样定义
#define NULL 0

我表示不是很理解,按道理来说,NULL 和 0 没区别啊,何必多此一举呢,求大佬能否详解一样NULL 和 0 的
差异!
...全文
9667 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
israle 2012-11-22
  • 打赏
  • 举报
回复
引用 11 楼 turingo 的回复:
1、意义不一样,NULL表示的是无效地址,而0是这个无效地址的一个实现; 2、NULL放在0这个地址比较常用,但是对某些硬件体系来说,这样并不方便,会浪费一个宝贵的第0页RAM空间,所以让它指向另外的地址会更加合理,比如#define NULL 0xff这样的定义。
对头
hannax 2012-10-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
最近看到几个帖子,都喜欢这样定义C/C++ code
#define NULL 0

我表示不是很理解,按道理来说,NULL 和 0 没区别啊,何必多此一举呢,求大佬能否详解一样NULL 和 0 的
差异!
[/Quote]
一般来说NULL的定义为:
#define NULL (void *)0
wzb56 2012-10-13
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

一.NULL字符
在ASCII码的第一个字符是NULL,它的数值是0,占用1字节;C语言把它作为字符串的最后一个字符,以表示字符串到此结束."\0"
二.NULL指针
在C语言的头文件stddef.h中,NULL的定义如下:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
……
[/Quote]

ASCII码表中的空字符好像只有一个L,NUL,而非次NULL。
空字符,NUL, '\0', 其ascii码值是0.
wzb56 2012-10-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

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

这个说的很好,但是,好像不是浪费吧,好像第0页是操作系统使用的吧,应用程序使用的话,硬件能够检测的错误的。
滴答滴答D 2012-10-13
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 的回复:]

蛋疼。这些都是编译器的错啊,为何当指针为null 0时,访问的时候报错啊,你如果不用编译器,直接读内存,看看什么结果??????

其实null本不存在,存在的道理是为了让我们好理解,结果,造成了大家的疑惑。

你想如果不经过编译器,null是什么啊?你知道么,它存在么?不过貌似指针也不存在了。。。

理解就行了,觉得大家说的都有道理,理解就行,就是个符号,给个初始值,防止不初始化直……
[/Quote]
同意!!!!
zbdzjx 2012-10-12
  • 打赏
  • 举报
回复
说一下个人的观点:
Null不只C/C++中有,其他语言、数据库中也有,其实Null是一个概念,就是指非0、非空字符串,什么都不是的一个东西。但它却要在计算机中保存,那用什么来保存?就象上面说的,有的语言是用0,用的语言是用-1,有的语言是用其他一些语法。当然,最终,在进行语法处理时,Null应该会用一些特殊手段来处理的。所以,虽然Null定义成0,但应该与0不完全相等。
meichen8050753 2012-10-11
  • 打赏
  • 举报
回复
可以吧NULL看成一个常量。
程旭元 2012-10-11
  • 打赏
  • 举报
回复
0 只是null的一种实现。。。。
7ero 2012-10-11
  • 打赏
  • 举报
回复
C/C++ 里 null 就是 0 吧。

另外 char 是值类型,值类型是没有 null 的概念的。
lin5161678 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 的回复:]

你自己仔细看看上面的回帖,是有人提出NULL是关键字,还有一个人说访问NULL程序崩溃是编译器干的,绕过编译器就可以了.这不是在误导是什么?
另外保留字是什么东西?包含NULL的头文件在#define NULL,编译器将警告并用后定义的,而不是UB.[/Quote]
嗯 这个#define NULL 是我没弄清楚了
fdisksys 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 的回复:]

引用 50 楼 的回复:
上面提到的很多都误导.
NULL跟编译器没有关系,只跟头文件怎么定义有关系.访问NULL报错也跟编译器没有关系,你绕过编译器直接写NULL同样被KILL,这是操作系统和硬件干的.NULL不是关键字,只是一个宏.NULL通常是(void*)0.你愿意也可以写0.但是严格来说0是错误的.地址0是一个有效的地址,访问0地址光从语言的角度是合法的.访问NULL地址才是错误……
[/Quote]
你自己仔细看看上面的回帖,是有人提出NULL是关键字,还有一个人说访问NULL程序崩溃是编译器干的,绕过编译器就可以了.这不是在误导是什么?
另外保留字是什么东西?包含NULL的头文件在#define NULL,编译器将警告并用后定义的,而不是UB.
lin5161678 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 的回复:]
上面提到的很多都误导.
NULL跟编译器没有关系,只跟头文件怎么定义有关系.访问NULL报错也跟编译器没有关系,你绕过编译器直接写NULL同样被KILL,这是操作系统和硬件干的.NULL不是关键字,只是一个宏.NULL通常是(void*)0.你愿意也可以写0.但是严格来说0是错误的.地址0是一个有效的地址,访问0地址光从语言的角度是合法的.访问NULL地址才是错误的.但是受语言本身的局限,NUL……
[/Quote]
我觉得你在误导 C语言的NULL 没有和 0 挂钩 更没有和 (void*)0 挂钩
NULL不是关键字你说对了 不过NULL是保留字 如果include 的头文件有定义了 NULL 重新给定义NULL是UB
说NULL和编译器相关 的确是不准确了
NULL是由实现定义的 那么应该说和具体某一个平台的实现相关
访问NULL崩溃这个问题和本帖的讨论没什么关系了
这里主要研究NULL是不是只有0一种实现
fdisksys 2012-10-11
  • 打赏
  • 举报
回复
上面提到的很多都误导.
NULL跟编译器没有关系,只跟头文件怎么定义有关系.访问NULL报错也跟编译器没有关系,你绕过编译器直接写NULL同样被KILL,这是操作系统和硬件干的.NULL不是关键字,只是一个宏.NULL通常是(void*)0.你愿意也可以写0.但是严格来说0是错误的.地址0是一个有效的地址,访问0地址光从语言的角度是合法的.访问NULL地址才是错误的.但是受语言本身的局限,NULL和0挂钩了.
Star-light 2012-10-10
  • 打赏
  • 举报
回复
NULL不一定是0,有的定义成 (void*)0

c++11用nullptr吧
manxiSafe 2012-10-10
  • 打赏
  • 举报
回复
好了,听了各位的讲解,小弟已经理解NULL与0的差异,各位都不容易,分不多,希望下次有问题时还能够帮我解决,3Q !!!
lin5161678 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 的回复:]

引用 29 楼 的回复:

引用 27 楼 的回复:

其实一样,这辈子都变不了,NULL就是0

不是 0是NULL的一种实现 仅此而已
NULL是空指针常量
只要是空指针值 都有可能作为NULL的一种实现


还有其他“实现”吗?
[/Quote]

能有其他实现
c标准说了 NULL是由实现定义的一个空指针常数
是不是0 就看编译器个人喜好


AnYidan 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 的回复:]

我的理解:NULL是逻辑上的寓意空,同佛教的空、无。是有的反面。一切有的东西都是非空的。
引申到语法上就是:有含义的东西的反面,比如非0值。

c++中将其定义为0有它的道理,但是你也可以定义为其他的比如 void*0,我个人觉得后者才是比较完美的定义。
[/Quote]

空既是无,无既是空
霸小虎Tiger 2012-10-10
  • 打赏
  • 举报
回复
受教受教了
hudaojin 2012-10-10
  • 打赏
  • 举报
回复
再说好象 NULL 不是C++关键字
「已注销」 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 的回复:]

引用 27 楼 的回复:

其实一样,这辈子都变不了,NULL就是0

不是 0是NULL的一种实现 仅此而已
NULL是空指针常量
只要是空指针值 都有可能作为NULL的一种实现
[/Quote]

还有其他“实现”吗?
加载更多回复(39)

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧