判断指针是否为空

这两天一直迷惑一个问题,就是如何判断指针是否为空,通常有如下两种方式(假设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总觉得怪怪的。

三、结论

通过上面的分析,可以看到,这两种方式没有本质的区别。具体选哪种方式,一要看具体的逻辑表达式,而是要看代码可读性如何。

时间: 2024-12-14 06:09:07

判断指针是否为空的相关文章

ring0-内存可读、可写、有效性、指针是否为空、深度校验字符串(随手代码)

http://blog.csdn.net/hgy413/article/details/7907057 1.如在ring3下,则要判断是否可读可写: [cpp] view plaincopy KPROCESSOR_MODE PreviousMode; ULONG PID; PreviousMode = ExGetPreviousMode(); // 如果非内核模式,就要开始检查IN的这些参数都否可读 if (PreviousMode != KernelMode) { try { ProbeFor

链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学习过算法的系统性的课程,现在还是处于不断摸索的阶段,好多算法题目根本就没有什么思路,导致自己对好多题目都很是头疼,就算是自己做过的一些算法的题目,再次遇到也还是不一定会做出来,他给出的建议就是,看懂别人的程序,然后自己去敲,一定会出错,然后调试,有错误接着调试,一直到没有错误为止,并且要时常的去复习

javascript判断一个对象是否是空对象,localStorage和sessionStorage区别

判断一个对象是否是空对象: var obj ={}; 1. if(JSON.stringify(newobj)=="{}"){ console.log('kongduixiang')  }else{ console.log('hehe')  } 2. if(Object.keys(newobj).length == 0){ console.log('kongduixiang'); } localStorage和sessionStorage区别: localStorage和session

[转]PHP 判断数组是否为空的几种方法

来源:http://begeek.cn/post/5836.html?_biz=MjM5OTA1MDUyMA==&mid=407358558&idx=2&sn=b21877f23bf4063fa311185009c1f0b7&scene=0#wechat_redirect1468239755008 1. isset功能:判断变量是否被初始化 说明:它并不会判断变量是否为空,并且可以用来判断数组中元素是否被定义过 注意:当使用isset来判断数组元素是否被初始化过时,它的效率

javascript判断对象是否为空

JavaScript是一种弱类型的脚本语言,在开发中经常会因为语法不严谨而出现一些错误. 下面的方法是判断对象是否为空的方法,包括对 null.undefind.空字符等类型. //判断是否为空 为空返回 false 不为空返回true function isNotEmpty(_value) { return ((_value === undefined || _value === null || _value === "" || _value === "undefined&

java判断字符串是否为空的方法总结

http://blog.csdn.net/qq799499343/article/details/8492672 以下是java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法: if(s == null || s.length() <= 0); 方法三: Java SE 6.0 才开始提供的方法, 效率和方法二

js判断字段是否为空 isNull

//在js中if条件为null/undefined/0/NaN/""表达式时,统统被解释为false,此外均为true . //为空判断函数 function isNull(arg1) {  return !arg1 && arg1!==0 && typeof arg1!=="boolean"?true:false; } //alert(isNull(null));    //true //alert(isNull(''));    

freemarker判断对象是否为空或是否存在

freemarker中显示某对象使用${name}. 但如果name为null,freemarker就会报错.如果需要判断对象是否为空: <#if name??> -- </#if> 当然也可以通过设置默认值${name!''}来避免对象为空的错误.如果name为空,就以默认值("!"后的字符)显示. 对象user,name为user的属性的情况,user,name都有可能为空,那么可以写成${(user.name)!''},表示user或者name为null,

javascript 判断变量 是否为空null,undefined, 空数组,空对象(空Object),字符串是否为空或全由空白字符组成,数字是否为0,布尔是否为false。

javascript 判断变量 是否为空null,undefined, 空数组,空对象,空Object,字符串是否为空或全由空白字符组成,数字是否为0,布尔是否为false.由于Object没有length用 Object.keys()适用于数组,对象 返回可枚举的实例属性名组成的数组来判断是否为空. 利用逻辑判断中or (||)只要有一项为真则不再计算下一个表达式 来实现不管传入的参数是何种类型.只要符合我对空的定义即返回true. 1 function IsNothing(e) { 2 va