C语言正确使用空(null)指针
C语言中null很有趣,null指针值是NULL , NULL可能是0,0L 或 (void*)0 ,有时候很容易迷惑。null指针对于很多数据结构的实现来说都是很有用的特性,比如链表经常用null指针来表示链表结尾。下面对null指针进行讲解。
null概念是什么
null概念是通过null指针常量表示来支持一种抽象。这个常量可能是也可能不是常量0,C程序员不需要关心实际的内部表示。
NUL 是什么
NUL 是ASCII 字符集中 ‘\0’ 字符的名字,它的字节模式为全 0。NULL 指一个其值为 0 的指针。它们都是整型值,其值也相同,所以它们可以互换使用。
NULL宏是什么
NULL宏是强制类型转换为void指针的整数常量0,在很多库文件中都可以找到,包括stdio.h、stdblib.h、stddef.h,在这些库中定义如下:
如果我们把null赋值给pi,我们可以写如下代码:
int *pi = NULL;
上面都说了,null指针值是NULL , NULL可能是0,0L 或 (void*)0 ,我们可以给指针赋0,但是不能给pi赋任何别的整数值
语法正确:
int *pi = 0;
int *pi = NULL;
语法错误:
int * pi = 100;
int num = 5; int *pi = num;
关于C中指针为空的判断
指针可以作为逻辑表达式的唯一操作数。判断指针为空,我们可以这样设置
(一)
if(ptr) /* 如果 p 非空,则完成 */
{
//不是NULL
}
if(!ptr) /* 如果 p 为空,则完成 */
{
//是NULL
}
有时候我们看公司前辈的代码,还看见这样判断指针为空方式是:
(二)
if( NULL == ptr)
{
...
}
if(NULL != ptr)
{
...
}
上面(二)表达式都有效,但是冗余。这样可以更清晰,但是没必要显式地跟NULL做比较。ptr被赋了NULL值,那就会被解释为二进制0。
到底用不用NULL
使用指针时哪一种形式更好,是NULL呢,还是0呢?无论哪一种都完全没有问题,选择哪一种只是个人爱好。
有些开发者喜欢用NULL,因为这样会提醒自己是在用指针。另一一些人则觉得没必要,因为NULL其实就是0。
0的含义随着上下文的变化而变化,有时候可能是整数0,有时候又可能是null指针,看看这个例子:
int num;
int *ptr = 0; //这里的0表示null的指针NULL
pi = #
*pi = 0; //这里的0表示整数0
void指针
void指针是通用指针,用来存放任何数据类型的引用。例如:
void *vp
它有如下的特性:
1、任何指针都可以赋值给void指针
int num;
int *pi = #
void *pv = pi; //任何指针都可以赋值给void指针
pi = (int *) pv; //void指针赋值给其他类型的指针时都要进行转换
这里要注意一下:void指针只用做数据指针,而不能用做函数指针。void指针不能复引用 ,还有void指针不能参与指针运算,除非进行转换 。
总结
null指针值是NULL , NULL可能是0,0L 或 (void*)0 表示。选择NULL还是0?这个就看这个人喜好了,选择NULL会提醒自己是在使用指针。如果你是C++开发中可以使用nullptr(c++ 11)表示空指针。