C语言空指针NULL详解

空指针NULL:

在C语言中,如果一个指针不指向任何数据,我们就称之为空指针,用NULL表示。例如:

int *p = NULL;

NULL 是一个宏定义,在stdio.h被定义为:

#define NULL ((void *)0)

那么我们来看看什么是空指针?

[6.3.2.3-3] If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

因此,如果 a 是一个指针变量,则 a = 0;、a = 0L;、a = '\0';、a = 3 - 3;、a = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;), p 都成为一个空指针,由系统保证空指针不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。(tyc: 比如这里的(void*)0就是一个空指针。把它理解为null pointer还是null pointer constant会有微秒的不同,当然也不是紧要了

那么什么是NULL??

[6.3.2.3-Footnote] The macro NULL is defined in (and other headers) as a null pointer constant

即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此可以用 a = NULL; 来使 a 成为一个空指针。(tyc:很多系统中的实现:#define NULL (void*)0,与这里的“a null pointer constant”并不是完全一致的)。如果包含了相应的标准头文件而引入了 NULL 的话,则再在程序中重新定义 NULL 为不同的内容是非法的,其行为是未定义的。也就是说,如果是符合标准的程序,其 NULL 的值只能是 0,不可能是除 0 之外的其它值,比如 1、2、3 等。

根据下面这行代码我们来理解一下空指针NULL:

#include 
 int main()
{ 
int *a = NULL;
printf("%d\n", a); 
return 0; 
} 
运行结果: 0

根据宏定义我们知道:

(void *)0表示把数值 0 强制转换为void *类型,最外层的( )把宏定义的内容括起来,我们自己进行宏定义时也推荐这么做,防止发生歧义,所以最后运行结果为0。

那么你现在是否会想NULL和0是等价的呢??

答案肯定是否定的,我们都知道变量定义系统就会给他分配内存空间,指针变量也是如此,如果指针没有指向的话那么地址就是随机值。

例如:

int *p;//它不是空指针

这个指针的地址是一个随机值,如果不小心用的话就会导致数据错误,从而使程序退出。

NULL 使 p 指向地址 0。大多数系统中都将 0 作为不被使用的地址,所以运用 p 也不会毁坏数据。但并非总是如此,也有系统会使用地址 0,而将 NULL 定义为其他值,所以不要把 NULL 和 0 等同起来。

指针变量 p 是空指针的判断:

if ( p == 0 )

if ( p == '\0' )

if ( p == NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */stdio.h

if ( NULL == p )

if ( !p ) <---------------(这里和下面的if(p)都被专门说过一次,null定义不一定是0.这里如果贸然使用!p会很危险的.上面也专门解释了这种写法的危险性,所以这种写法不能被提倡)

指针变量 p 不是空指针的判断:

if ( p != 0 )

if ( p != '\0' )

if ( p != NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */stdio.h

if ( NULL != p )

if ( p != q )

如果大家对C语言感兴趣,可以关注小编公众号与小编一起学习C语言!!小编有干货的话会免费分享给大家的哦!!!

C语言空指针NULL详解_第1张图片

 

你可能感兴趣的:(C语言,指针,空指针)