8

什么是C语言中的空指针?

 3 years ago
source link: https://blog.popkx.com/%E4%BB%80%E4%B9%88%E6%98%AFc%E8%AF%AD%E8%A8%80%E4%B8%AD%E7%9A%84%E7%A9%BA%E6%8C%87%E9%92%88/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

什么是C语言中的空指针?

发表于 2019-07-21 16:07:52   |   已被 访问: 383 次   |   分类于:   C语言   |   暂无评论

指针是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)判断出错的情况。

阅读更多:   C语言


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK