在 C 中,NULL是一个扩展为空指针常量的宏。
宏是
NULL 扩展为实现定义的空指针常量;...
空指针常量是一个整数常量表达式,其值为0(例如0,1-1、42*0LL、 等)或此类表达式转换为(void*)。
值为 0 的整型常量表达式,或此类转换为 void * 类型的表达式,称为空指针常量。66) 如果将空指针常量转换为指针类型,则生成的指针(称为空指针)为保证与任何对象或函数的指针比较不相等。
最常见的 C 实现定义NULL为0、0L、 或((void*)0)。
所以你是对的。NULL不必是指针。
(IIRC,C++ 甚至不允许强制(void*)转换NULL,这意味着NULL在 C++ 中始终具有整数类型。正因为如此,并且因为void*指针在 C++ 中不那么容易与常规指针进行比较,所以 C++>=11 现在有一个特殊的nullptr关键字。)