请问谁知道C++中 NULL 和 0 的区别? 具体点的,谢谢了~~
例如:我在验证函数GetLogicalDriveStrings()时,GetLogicalDriveStrings(0,NULL)与GetLogicalDriveStrings(0,0)的值都是一样的,是不是代表NULL就等于0(数值上)。 展开
0是一个数字,本身有着一些原生的特性诸如:起始,没有,正负的分界线,0/1中的0还可以表示否定。0可以表示数字0,也可以表示ASCII码值为0的字符。
NULL用于将指针指定为空指针,也就是说该指针不指向任何对象,不可以对该指针进行解引用,否则系统会报错。
在数值上NULL,'\0',0是一样的,都是0,但'0'就不同了,在ASCII码中编码为48,所以字符0和上述三个值不同。
什么是 NULL?
[6.3.2.3-Footnote] The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant
即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。
指针的概念
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。
malloc 函数在分配内存失败时返回 0 还是 NULL?
malloc 函数是标准 C 规定的库函数。在标准中明确规定了在其内存分配失败时返回的是一个 “null pointer”(空指针):
[7.20.3-1] If the space cannot be allocated, a null pointer is returned.
对于空指针值,一般的文档(比如 man)中倾向于用 NULL 表示,而没有直接说成 0。但是我们应该清楚:对于指针类型来说,返回 NULL 和 返回 0 是完全等价的,因为 NULL 和 0 都表示 “null pointer”(空指针)。
‘\0’:‘\0’是一个“空字符”常量,它表示一个字符串的结束,它的ASCII码值为0。注意它与空格' '(ASCII码值为32)及'0'(ASCII码值为48)不一样的。在C/C++中,当要给一个字符串添加结束标志时,都应该用‘\0’而不是NULL或0。
当我们要置一个指针为空时,应该用NULL,当我们要给一个字符串添加结束标志时,应该用‘\0’。
#define NULL 0 ,即NULL的值为0
2.0可以表示数字0,也可以表示ASCII码值为0的字符
要么是0,要么是((void*)0)
A null pointer is generally used to signify that a pointer does not point to any object.
In C++, NULL expands either to 0 or 0L.
源文件:
/* Define NULL pointer value and the offset() macro */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
#define NULL ((void *)0)
其实NULL是地址空间为0x00000000起始的4k页
这个地址是不可访问的,所以你如果强制访问会出错,这也是NULL多用于指针的原因。