判断指针是否为空 http://blog.csdn.net/chenyufei1013/article/details/6193295
来源:互联网 发布:免费网站源码下in7k 编辑:程序博客网 时间:2024/06/15 19:42
判断指针是否为空
![](http://static.blog.csdn.net/images/category_icon.jpg)
版权声明:本文为博主原创文章,未经博主允许不得转载。
这两天一直迷惑一个问题,就是如何判断指针是否为空,通常有如下两种方式(假设p为指针):
if (NULL == p) {
// ...
}
if (!p) {
}
到底哪种方式好呢?这个问题应该从两个方面去考虑,本文就是围绕这两个问题展开的,仅限于C语言。
它们在语义、编译等环节上是否等价?
它们在可读性、可维护性等上面是否等价?
一、是否存在隐式类型转换?
《C 程序设计语言中》规定(中文第二版177页),对于运算符==和!=,可以作如下比较:指针可以和值为0的常量表达式或指向void的指针进行比较。而NULL在C中被定义为((void*)0),故NULL == p可以直接进行。
而175页也同时规定,运算符!的运算分量必须是一个算术类型或指针。如果运算分量等于0,那么结果为1,否则结果为0。结果类型为int。
由上面的分析可以看出,上述两个条件判断都不需要进行隐式类型转换。同时,我也在VC2008下面测试了一下,这两种情况下的汇编都为如下形式:
1: 00971578 cmp dword ptr [p],0
2: 0097157C jne test1+0A3h (971583h)
更深一步的讲,C99规范对运算符==和!也是有规定的,和《C 程序设计语言中》描述一致。第6.3.5节,第5点明确表示!E和0==E等价。参见下面的具体描述:
5 The result of the logical negation operator ! is 0 if the value of its operand compares
unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int.
The expression !E is equivalent to (0==E).
第6.5.9节中规定==两边的操作数,可以一边是指针,一边是指向void类型的指针;或者,一边是指针一边是空指针常量。参见下面的具体描述:
— one operand is a pointer to an object or incomplete type and the other is a pointer to a
qualified or unqualified version of void; or
— one operand is a pointer and the other is a null pointer constant.
二、可读性
《C 程序设计语言中》中文第二版32-33页讲到运算符!时,建议使用!p而不要使用p == 0。但同时又提到在复杂的情况下可能难于理解。个人认为,!p的方式可以使代码更短,看起来简洁,NULL == p总觉得怪怪的。
三、结论
通过上面的分析,可以看到,这两种方式没有本质的区别。具体选哪种方式,一要看具体的逻辑表达式,而是要看代码可读性如何。
- 判断指针是否为空 http://blog.csdn.net/chenyufei1013/article/details/6193295
- http://blog.csdn.net/howlaa/article/details/45367697 view.manure(0,0) 报空指针异常
- 函数指针与指针函数 http://blog.csdn.net/htyurencaotang/article/details/11490081
- 清空缓冲区的方法http://blog.csdn.net/thecorr/article/details/1922541
- 空类大小 http://blog.csdn.net/ianchoi/article/details/6335908
- 指针以及内存分配(转载自:http://blog.csdn.net/bizhu12/article/details/6532235)
- 虚指针的用法(原出处//http://blog.csdn.net/haoel/article/details/1948051)
- C++中智能指针的设计和使用 http://blog.csdn.net/hackbuteer1/article/details/7561235
- sizeof(数组名)和sizeof(指针) http://blog.csdn.net/kangroger/article/details/20653255
- c++ 返回值为 类的对象 http://blog.csdn.net/zyearn/article/details/9709041
- java spring为ApplicationContext提供有三种实现http://blog.csdn.net/jyonghu003/article/details/59631621
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏 http://blog.csdn.net/code_godfather/article/details/66480
- http://blog.csdn.net/IBM_hoojo/article/details/5688947
- http://blog.csdn.net/chenlaic/article/details/6143235
- http://blog.csdn.net/eaglewood2005/article/details/4335052
- http://blog.csdn.net/mchp/article/details/3995970
- http://blog.csdn.net/v_july_v/article/details/6015165
- http://blog.csdn.net/masterz/article/details/6232585
- 122 The user SYS creates a job by using the following command: BEGIN DBMS_SCHEDULER.CREATE_JOB ( job
- 第二十一节 DHT11温湿度传感器
- 横竖屏切换问题
- PHP网站开发遇到的中文编码问题
- mysql command line client和mysql.exe输入密码后闪退问题解决方法
- 判断指针是否为空 http://blog.csdn.net/chenyufei1013/article/details/6193295
- powerdesigner 15打开pdm文件弹出安装打印机窗口
- Ubuntu 终端命令行显示路径太长
- 成都企业整站优化分析心得
- c语言中数组的内存建立
- HDU 1181 DFS回溯思想
- 【项目实战】——Java实现伪静态——urlrewrite
- Tomcat学习(一) - Tomcat结构以及处理一个请求的过程(转载忘了出处)
- chrome开发者工具调试时改变网速