指针空值类型 nullptr
NULL 的定义
C 语言中的 NULL
在 C 语言中,NULL 通常被定义为 (void *) 0,即一个指向地址 0 的空指针。void * 是一种通用指针类型,可以隐式转换为其他指针类型。
#ifndef NULL
#define NULL ((void *) 0)
#endif
C++ 语言中的 NULL
C++ 是强类型语言,不允许隐式地将 void * 转换为其他指针类型(如 int *)。因此为了兼容性,NULL 在 C++ 中定义为整数常量 0
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *) 0)
#endif
#endif
注意:现代 C++ 推荐使用
nullptr来表示空指针,因为它具有明确的类型std::nullptr_t,避免了NULL在不同上下文中的歧义。
为何指针可以赋值为 0
在 C 中
在 C 语言中,地址 0 被保留作为空指针常量。编译器允许将整数常量 0 或 NULL(即 (void *) 0)赋值给任何类型的指针变量。地址 0 被特殊处理,表示“无指向”或“空”。
int *ptr = NULL; // 或者 int *ptr = 0;
在 C++ 中
在 C++ 中,情况类似,但由于类型系统的严格性,直接将 0 赋值给指针变量需要一些解释:
-
整数常量
0:在指针上下文中,整数常量0被视为空指针常量。因此,你可以将0赋值给指针变量,编译器会将其解释为空指针。int *ptr = 0; // 合法,0 被视为 NULL -
NULL宏:如前所述,在 C++ 中NULL通常被定义为0,因此行为与直接使用0相同。int *ptr = NULL; // 合法,等同于 int *ptr = 0; -
nullptr(C++11 及以后):引入nullptr是为了提供一个明确表示空指针的类型安全方式,避免NULL在不同上下文中的歧义。int *ptr = nullptr; // 推荐使用
为什么NULL C用 (void *) 0 C++用 0
在 C 中,void * 可以隐式转换为其他指针类型,这使得 NULL 的定义 (void *) 0 可以无缝赋值给任何指针类型。而C++的类型系统更严格,不允许这样的隐式类型转换,而为了同时兼容C,直接定义为C指针可用的 0 常量,同时避免了NULL的隐式转换。
nullptr
NULL可以为指针和变量赋值,存在类型歧义,而nullptr 是为了消除 NULL 带来的潜在问题,如重载函数时的歧义。
void func(int);
void func(char*);
func(NULL); // int
func(nullptr); // 明确调用 func(char*)

浙公网安备 33010602011771号