vlambda博客
学习文章列表

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
}


有时候我们看公司前辈的代码,还看见这样判断指针为空方式是:
(二)


ifNULL == 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)表示空指针。



推荐好文