C语言的字符串,'\0',NULL,有什么区别?

QAIAQ 2011-08-30 08:57:12
如: 1.while(*x!='\0'); 2.while(*x!=NULL); 有什么区别?
...全文
1379 51 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
haibo521333 2013-12-30
  • 打赏
  • 举报
回复
'\0',8bits的0; NULL,32bits的0;
ForestDB 2013-12-30
  • 打赏
  • 举报
回复
发表于: 2011-08-30 08:57:12 结帖率:0% 还是沉了吧。
gz_qmc 2013-12-30
  • 打赏
  • 举报
回复
1.while(*x!='\0'); 一般表示定义的是 char *x; 2.while(*x!=NULL); 则一般表示定义的是 char **x;
赵4老师 2013-12-30
  • 打赏
  • 举报
回复
谁顺便解释一下L'\0'
iamnobody 2013-12-30
  • 打赏
  • 举报
回复
引用 47 楼 mingliang1212 的回复:
如果 x 的类型是 char * 那么 *x != '\' 是对的. 那么 *x != NULL 是错的. 不能拿一个字符类型跟指针类型比较. 看了这么久,没有一个人说出这是错的.
还有,普及个常识,编译通过不代表程序正确.
iamnobody 2013-12-30
  • 打赏
  • 举报
回复
如果 x 的类型是 char * 那么 *x != '\' 是对的. 那么 *x != NULL 是错的. 不能拿一个字符类型跟指针类型比较. 看了这么久,没有一个人说出这是错的.
ActorKeyy 2013-12-30
  • 打赏
  • 举报
回复
没有本质意义的区别,只是解释意义上的区别而已,一个是字符类型,一个是指针类型。但是,其值都是0。
L_stephie 2013-12-30
  • 打赏
  • 举报
回复
引用 41 楼 lm_whales 的回复:
ASCII 只有7位,用8Bits 表示都有点浪费了。 '\0' 是8Bits NULL 跟指针一样长. X86 DOS, Windows :16Bits 为2字节 near 指针,4字节 far 指针 X86,32 Bits 有32 Bits 和48 Bits 两种指针, 不过MS 在 Windows这里,偷懒一下; 同时也保护了操作系统。 只使用 32Bits指针 (near 指针),不使用48Bits (far 指针) 其他编译器,也跟着偷懒,所以只有32Bits指针 (near 指针)。 '\0' 只用来表示字符串结束。 NULL只用来表示指针为空指针。 二者混用,对于字符串来说,就多了几个字节,当写字符串的时候,可能就越界了。 即使编译器能够正确处理,逻辑上也是不对的。 对于指针,可能没什么,不过编译器,可能会给你一个警告。 当你看到,一个字符串结束符用NULL赋值,初始化,你的头估计会有两个大。 同样,当你看到指针,居然用字符'\0' 赋值,初始化,你估计也会觉得不太对头。 C++ ,为了区分整数0,和空指针 又搞出个 nullptr C++ 无法区分NULL 和0 结果是 int 和指针重载会有冲突,特别是参数为常量 0的时候。 你这里,居然要合并 ‘\0’,和NULL 你真以为的,合并会比, 分开更好吗????
+
Mr. Code 2013-12-29
  • 打赏
  • 举报
回复
C语言中可以认为两者都是0。但实际是有区别的,\0表示ASCII码的0的八进制的写法,值就是0,通常用于表示0结尾的字符串的结尾,NULL在C语言中定义为(void *)0,是宏,通常用于表示将指针悬空,但在别的语言中,NULL是不一定等同于0的,把指针悬空,和0是两码事,所以两者有些区别。在一些语法检查比较严格的语言中,比如C#,两者是不可以互相替换的。
lm_whales 2013-12-28
  • 打赏
  • 举报
回复
ASCII 只有7位,用8Bits 表示都有点浪费了。 '\0' 是8Bits NULL 跟指针一样长. X86 DOS, Windows :16Bits 为2字节 near 指针,4字节 far 指针 X86,32 Bits 有32 Bits 和48 Bits 两种指针, 不过MS 在 Windows这里,偷懒一下; 同时也保护了操作系统。 只使用 32Bits指针 (near 指针),不使用48Bits (far 指针) 其他编译器,也跟着偷懒,所以只有32Bits指针 (near 指针)。 '\0' 只用来表示字符串结束。 NULL只用来表示指针为空指针。 二者混用,对于字符串来说,就多了几个字节,当写字符串的时候,可能就越界了。 即使编译器能够正确处理,逻辑上也是不对的。 对于指针,可能没什么,不过编译器,可能会给你一个警告。 当你看到,一个字符串结束符用NULL赋值,初始化,你的头估计会有两个大。 同样,当你看到指针,居然用字符'\0' 赋值,初始化,你估计也会觉得不太对头。 C++ ,为了区分整数0,和空指针 又搞出个 nullptr C++ 无法区分NULL 和0 结果是 int 和指针重载会有冲突,特别是参数为常量 0的时候。 你这里,居然要合并 ‘\0’,和NULL 你真以为的,合并会比, 分开更好吗????
wzhynet 2013-12-28
  • 打赏
  • 举报
回复
引用 35 楼 wzr_8703 的回复:
[quote=引用 32 楼 Athenacle_ 的回复:] [quote=引用 30 楼 wzr_8703 的回复:] [quote=引用 18 楼 zhao4zhong1 的回复:] '\0'是字符常量;NULL是宏。
跟没说一样。[/quote] 这才是本质区别[/quote] 这算什么本质区别,离本质相差几千里
引用 15 楼 hml1006 的回复:
值相同,类型不同
这句话才是本质区别[/quote] 我来说下吧。这位大哥虽然说出了NULL是宏, 但是你真的解答了别人的问题吗? 虽然你没错,但答非所问,这才是大家的疑惑。 对,它是宏,但是这个宏定义了什么,通常情况下,两种: #define NULL ((void *)0) #define NULL 0 '\0'我就不说了,大家按字面去理解。 对了,0地址很特殊,不管按哪种类型转换,还是地址为0的指针,也就是指针变量刚出生就“必须"要定义的出生地,而且,你不能试图去读取它里面存储的变量,不然系统会报错,因为0地址存储的东西就是没有,你偏要去用*去取它存的值,都会抱错。但是,你可以去取它的地址,然后用相应的类型打印出来,你得到结果就是你的答案: int main() { int *p=NULL; printf("p s=%s\n",p); printf("p d=%d\n", p); printf("p f=%f\n", p); } 输出结果: p s=(null) p d=0 p f=0.000000
wizard_tiger 2013-06-01
  • 打赏
  • 举报
回复
LS都说了,路过学习一下。
zaixiankaifa 2013-06-01
  • 打赏
  • 举报
回复
NUll是空指针,'\0'是字符结尾的标志
zcronline 2013-05-31
  • 打赏
  • 举报
回复
引用 8 楼 AnYidan 的回复:
查 ascii 码表, nul 表示 0, 很多数搞混了 nul 和 null
nul是ascii字符集中'\0'的名字,他的自己模式为全0;NULL指一个其值为0的指针,他们都是整型值,其值也相同,可以相互使用。 NULL在stdio.h中定义。 -------------摘自pointers on C (Page 7)
赵4老师 2013-05-31
  • 打赏
  • 举报
回复
引用 35 楼 wzr_8703 的回复:
[quote=引用 32 楼 Athenacle_ 的回复:] [quote=引用 30 楼 wzr_8703 的回复:] [quote=引用 18 楼 zhao4zhong1 的回复:] '\0'是字符常量;NULL是宏。
跟没说一样。[/quote] 这才是本质区别[/quote] 这算什么本质区别,离本质相差几千里
引用 15 楼 hml1006 的回复:
值相同,类型不同
这句话才是本质区别[/quote] 编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E
wzr_8703 2013-05-31
  • 打赏
  • 举报
回复
引用 32 楼 Athenacle_ 的回复:
[quote=引用 30 楼 wzr_8703 的回复:] [quote=引用 18 楼 zhao4zhong1 的回复:] '\0'是字符常量;NULL是宏。
跟没说一样。[/quote] 这才是本质区别[/quote] 这算什么本质区别,离本质相差几千里
引用 15 楼 hml1006 的回复:
值相同,类型不同
这句话才是本质区别
柳叶吴钩 2013-05-27
  • 打赏
  • 举报
回复
NULL用于判断指针X指向的是否是空字符串.
SKATE11 2013-05-27
  • 打赏
  • 举报
回复
对 保持代码质量 最好别混用
Athenacle_ 2013-05-27
  • 打赏
  • 举报
回复
引用 30 楼 wzr_8703 的回复:
[quote=引用 18 楼 zhao4zhong1 的回复:] '\0'是字符常量;NULL是宏。
跟没说一样。[/quote] 这才是本质区别
赵4老师 2013-05-27
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
加载更多回复(30)

70,017

社区成员

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

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