NULL不是一个关键字,也不属于保留字,NULL的本质是一个宏定义。
#ifndef NULL
#ifdef __cplusplus
#ifndef _WIN64
#define NULL 0
#else
#define NULL 0LL
#endif /* W64 */
#else
#define NULL ((void *)0)
#endif
#endif
NULL是一个被强制类型转换的void类型的0,这个0是一个地址0x00000000代表内存地址0的地址,占内存地址4个字节,这个指针变量指向0x0地址,指向一个内存地址,本质还是0,但是一个特殊0。
在int *p;被定义时,未被初始化的值为随机的(局部)是一个野指针。
int *p=NULL;p是一个局部变量,分配在栈上,值为(void*)0,指向内存地址的0x0地址处,因为指在内存的0x0地址处很安全,一般方式无法访问,cpu会进行处理。
NULL存在的意义:1.安全性。2.是一个标记,标准指针的使用方式。
int *p=NULL;
p=xxx;
if(NULL!=p) p可以被赋值,但NULL不能
{
*p=xxx;
....;
}
p=NULL;
不用混用NULL和'\0'。
‘\0’,‘0’,0,NULL是不一样的。
‘\0’是一个转义字符,对应是ASCII是0,本质为0。一般用于字符串结尾标志。
‘0’是一个字符,对应ASCII为48,本质是48。有对应的ASCII码,用于与字符对照。
0是一个数字,不是ASCII。代表一个数字。
NULL是一个表达式,表示为(void*)0。是一个指针。