C语言编程学习空指针NULL详解
C语言是面向过程的,而C++是面向对象的
C和C++的区别:
C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。
C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。
C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。
空指针NULL:
在C语言中,如果一个指针不指向任何数据,我们就称之为空指针,用NULL表示。例如:
NULL 是一个宏定义,在stdio.h被定义为:
那么我们来看看什么是空指针?
[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 <stddef.h> (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:
根据宏定义我们知道:
(void *)0表示把数值 0 强制转换为void *类型,最外层的( )把宏定义的内容括起来,我们自己进行宏定义时也推荐这么做,防止发生歧义,所以最后运行结果为0。
那么你现在是否会想NULL和0是等价的呢??
答案肯定是否定的,我们都知道变量定义系统就会给他分配内存空间,指针变量也是如此,如果指针没有指向的话那么地址就是随机值。
例如:
这个指针的地址是一个随机值,如果不小心用的话就会导致数据错误,从而使程序退出。
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++能做的
服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等