1、NULL不是关键字,本质上是个宏定义
2、NULL标准定义:
#ifdef _cplusplus // 判断当前编译环境是C还是C++
#define NULL 0 // C++环境下,编译器预先定义一个宏_cplusplus
#else
#define NULL (void *)0 // C语言环境
#endif
NULL 的本质解析: NULL的本质就是0,但是这个0不是按一个数字解析,而是当一个内存地址解析的,这个0其实是0x00000000,代表是内存的0地址。
(void *)0这个整体表示式表示一个指针,这个指针变量占4字节,地址在哪里取决于变量本身,但是这个指针变量的值是0,也就是这个指针变量指向0地址。
1、int * p;
解析:p是一个函数内的局部变量,则p的值是随机的,这时候的p就是一个野指针。
2、int *p = NULL;
解析:p是一个局部变量,分配在栈上的地址是由编译器决定的。p的值是(void *)0.实际上就是0,意思是指针指向内存地址0处,这时候p就不是野指针。
因为在大部分CPU中,内存0地址处都是不可以随便访问的。所以野指针指向了这个区域可以保证野指针不会造成误伤。
1、让野指针指向0地址安全
2、作为一个特殊标志。按照标准的指针使用步骤:
int *p = NULL; // 定义p时立即初始化为NULL
P = XX;
if (NULL != p)
{*p // 在确认p不等于NULL的情况下才去解引用它
}
p = NULL; // 用完之后p再次等于NULL
含义 | ASCII编码值 | 本质 | 用法 | |
---|---|---|---|---|
‘\0’ | 转义字符 | 0 | 0 | C语言字符串的结尾标志,一般用来比较字符串中的字符判断字符串有没有结束。 |
‘0’ | 字符 | 48 | 48 | 一般用来获取0的ASCII码值 |
0 | 数字 | -- | 0 | 一般用来比较一个int类型的数字是否等于0 |
NULL | 表达式 | -- | 强制类型装换为void *类型的0 | 一般用来比较指针是否是一个野指针 |