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

\0是字符串结束符,用于判断指针x是否到达字符串末尾

NULL用于判断指针X指向的是否是空字符串.

 

通常 '\0'和NULL的值都是0。但他们各自代表的含义不同。判断字符串结尾时,用'\0'。判断指针,用NULL。不要混用。

查 ascii 码表, nul 表示 0, 很多数搞混了 nul 和 null 

 

\0是字符串的结束标识符。
NULL是指指针指向一个地址为0的地址块。

1.while(*x!='\0');
用来判断指针是否指到数据的结尾了。
2.while(*x!=NULL);
用来判断指针所指向的数据是否为空。

 

#if !defined(__cplusplus)
#define NULL    ((void *)0)
#else
#define NULL    0 
#endif

'\0'是字符常量;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

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的时候。

C语言中可以认为两者都是0。但实际是有区别的,\0表示ASCII码的0的八进制的写法,值就是0,通常用于表示0结尾的字符串的结尾,NULL在C语言中定义为(void *)0,是宏,通常用于表示将指针悬空,但在别的语言中,NULL是不一定等同于0的,把指针悬空,和0是两码事,所以两者有些区别。在一些语法检查比较严格的语言中,比如C#,两者是不可以互相替换的。

 

'\0',8bits的0;
NULL,32bits的0;

如果 x 的类型是 char *
那么 *x != '\' 是对的.
那么 *x != NULL 是错的. 不能拿一个字符类型跟指针类型比较.

 

1.while(*x!='\0');
  一般表示定义的是
  char *x;
2.while(*x!=NULL);
  则一般表示定义的是
  char **x;

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息

 

 

posted @ 2014-01-01 15:59  yuanqi  阅读(2901)  评论(0编辑  收藏  举报