指针是C语言的灵魂,因此随意挑选一个C语言程序项目,一般都能够看到指针的大量应用。而在C语言指针中又有着一类比较特殊的指针,即所谓的“空指针(NULL pointer)”,也是C语言程序开发中不可规避的。本节将以问答的形式讨论C语言中空指针的特性,希望对读者有所帮助。
到底什么是空指针?
对于每一种指针类型,都有一个特殊的值——空指针,空指针与其他所有指针值区分开来,保证其不会指向任何函数或者对象等有意义的数据。因此,取地址运算符 & 永远不会产生空指针,malloc() 函数成功时永远不会返回空指针。
C语言中空指针在概念上不同于未初始化的指针,因为空指针不指向任何函数或对象,而未初始化的指针指向是不确定的,它可能指向任何位置,所以未初始化的指针只是有可能是空指针。
总结一下,C语言中的空指针其实就是一个有特殊值的指针。不同类型的空指针值可能不同(尽管很多平台都将空指针值设为 0),C语言程序员应该明白这一点。
既然C语言空指针可能不为0,那么判断指针是否空指针,缩写成 if(p) 还安全吗?
当然是安全的。C语言需要做布尔判断时,可以使用if(expr) 语句,如果表达式 expr 非零则表示得到真值,否则将得到假值。也就是说,如果程序员写出:
if(p)
C语言编译器其实会将其当作下面这样的语句处理:
if(p != 0)
读者可能会有疑问:上面不是说C语言中的空指针可能不是 0 吗?这种情况下,if(p!=0) 不就没有办法判断 p 究竟是不是空指针了吗?
事实上,C语言编译器在处理代码时会考虑代码的上下文,if(p!=0)中的 p 如果是指针,那么编译器其实会将(implicit)0 替换成 p 所属类型的空指针。所以不必担心空指针非零会导致if(p)判断出错的情况。