NUL 是ASCII 字符集中 '\0' 字符的名字,它的字节模式为全 0。NULL 指一个其值为 0 的指针。它们都是整型值,其值也相同,所以它们可以互换使用。然而,你还是应该使用适当的常量,因为它能告诉阅读程序的人不仅使用 0 这个值,而且告诉他使用这个值的目的。

符号 NULL 在头文件 staio.h 中定义。另一方面,并不存在预定义的符号 NUL,所以如果你想使用它而不是字符常量 '\0',你必须自行定义。

NULL是一个宏,它在几个标准头文件中定义,0是一个整型常量,'\0'是一个字符常量,而NUL是一个字符常量的名字。这几个术语都不可互换。
1、NULL用于表示什么也不指向,也就是空指针((void *)0)
2、0可以被用于任何地方,它是表示各种类型零值的符号并且编译器会挑出它
3、'\0'应该只被用于结束字符串
4、NUL没有被定义于C和C++,它不应该被使用,除非你自己定义它,像:#define nul '\0'

空指针:值是NULL , NULL可能是0,0L 或 (void*)0 

C 语言的定义,每一个指针类型,是一种特殊的值,空指针。 这与所有其他指针值区分开来,“保证不平等比作一个指针指向任何对象或函数”。也就是说,一个空指针应该明确,它不是任何对象或函数的地址。取地址运算符 & 永远不会产生一个空指针,也不会成功的调用 malloc。(malloc返回一个空指针则分配内存失败,这是一个典型的使用空指针,作为“特殊”指针值与其他意义,通常“不分配”或“没有指向任何地方”)。
一个空指针概念上不同于未初始化的指针。一个空指针是已知不指向任何对象或函数,未初始化的指针可能再任何地方。
正如上面提到的,有一个空指针对于每个指针类型,和内部不同类型的空指针的值可能会有所不同。虽然程序员不需要知道内部值,编译器必须告知哪种类型的空指针是必需的,所以,如果有必要,需要区别对待。


空指针的用法 :
用空指针终止对递归数据结构的间接引用 
用空指针作函数调用失败时的返回值 
用空指针作警戒值

注意,当我们将 0 赋值给一个指针变量时,绝对不能企图使用该指针所指向的内存中存储的内容。例如:

下面的写法是完全合法的:

#include <stdio.h>
#include <string.h>int main (void)
{char p[20];if (p == (char*)0){printf ("1111111111\n");}printf ("222222222222\n");return 0;
}
输出结果:
222222222222

但是如果写成这样就非法了:

#include <stdio.h>
#include <string.h>int main (void)
{char p[20];if (strcmp (p, (char*)0) == 0){printf ("111111111111\n");}return 0;
}
输出结果:
段错误 (核心已转储)
#include <stdio.h>
#include <string.h>int main (void)
{char *p = NULL;printf ("%s\n", p);return 0;
}
输出结果:
段错误 (核心已转储)

这部分可参看:C语言再学习 -- 段错误(核心已转储)

NULL 指针并不指向任何对象。因此,除非是用于赋值或比较运算,出于其他任何目的的使用NULL指针都是非法的。

C语言再学习 -- NUL和NULL的区别相关推荐

  1. C语言再学习 -- 详解C++/C 面试题 1

    参看:<高质量C++ C编程指南>.林锐 对这篇文章记忆犹新,因为之前找工作面试的时候,遇到过一家公司就是用的这套面试题.现在就结合考查的知识点和我总结完 C 语言再学习后的深入理解,来详 ...

  2. C语言再学习 -- 创建excel文件

    参看:C语言操作Excel表格 上一篇文章讲了一下 cJSON,可以生成json文件了.这篇文章讲一下怎么生成excel表xsl格式文件. 注意点: 1.文件类型为 xls 或者 xlsx 2.使用f ...

  3. C语言再学习 -- 再论内存管理

    之前有总结过内存管理,参看:C语言再学习 -- 内存管理 但现在看来,缺少示例.从新再写一篇文章,着重介绍常见内存错误.跨函数使用存储区.开始吧,再论内存管理!! 发生内存错误是件非常麻烦的事情.编译 ...

  4. C语言再学习 -- 详解C++/C 面试题 2

    (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题. 参看:嵌入式程序员面试问题集锦 1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define ...

  5. C语言再学习 -- 再论数组和指针

    之前有总结指针数组,但是现在看来总结的太简单了.好多重要的知识点都是一带而过的.本想在后面添加后来想想算了,还是再写一篇文章来详细介绍数组和指针这对冤家吧. 之前总结的,参看:C语言再学习 -- 数组 ...

  6. C语言再学习 -- 时间函数

    在软件设计中经常会用到关于时间的处理,用来计算语句.函数的执行时间,这时就需要精确到毫秒甚至是微妙的时间.我们首先来介绍一下,时间单位: 时间单位还有:秒(s).毫秒(ms).微秒 (μs).纳秒(n ...

  7. C语言再学习 -- 结构和其他数据形式

    一.结构体 结构体可以用来创建新的数据类型,这种数据类型可以把多个其他类型合并成一个整体,采用结构体声明的变量叫做结构变量,结构体需要先声明然后才能使用,声明结构体需要使用struct关键字,结构体声 ...

  8. C语言再学习 -- 文件

    文件是什么 一个文件(file)通常就是磁盘上的一段命名的存储区.C 将文件看成是连续的字节序列,其中每一个字节都可以单独地读取. 二进制和文本模式 1.在windows系统中,文本模式下,文件以&q ...

  9. C语言再学习 -- 字符串和字符串函数

    最近身体很不给力,很乏累!白天没精神,晚上睡不着,心情还很烦躁.看书都有点看不下去的样子,到了C语言最难掌握的部分了,数组.指针.字符串.硬着头皮看书总结吧. 一.字符串 1.字符串介绍 字符串是以空 ...

最新文章

  1. Linux中命令配置防火墙
  2. JAVA基础----java中E,T,?的区别?
  3. Ubuntu系统如何安装nodejs及npm
  4. 命令行请求jsp页面_JSP 之 8种HTTP的请求方式 之 页面组成等
  5. SRS流媒体服务器——Edge集群搭建
  6. 【Vegas原创】分别用Toad、EM解表锁
  7. mysql获取下一条自增的id_mysql获取一个表中的下一个自增(id)值的方法
  8. 软件 Bug 引发的致命事故,程序员责任何在?| 技术头条
  9. 【三维路径规划】基于matlab自适应遗传算法求解单无人机三维路径规划问题【含Matlab源码 214期】
  10. Smobiler实现app的主页——C# 或.NET Smobiler实例开发手机app(三)
  11. Zim-个人wiki系统
  12. 系统接口框架设计与实现
  13. Android手机Root授权原理细节全解析
  14. vue+element_ui上传文件,并传递额外参数
  15. Altium designer AD原理图导入word文档、pdf,生成矢量图的方法;
  16. esc键退出全屏 vue_vue项目实现全屏,退出全屏,图标切换的解决方案
  17. 配置Office Excel运行Python宏脚本!
  18. 自学SQL网题库答案
  19. 分享20款自己收藏的wordpress主题
  20. CSDN-Adobe Flex/AIR专区——http://flex.csdn.net/ 很多资料

热门文章

  1. Metail Design入门(一)
  2. ZigZag Conversion leetcode java
  3. 【shell】常用语法 -b file -c file -f file-d file -x file
  4. 在.c文件中调用cuda函数
  5. linux 开机启动文件夹,Linux开机启动流程
  6. 【算法】一个简单的K近邻(KNN)原理
  7. libSVM笔记之(一)在matlab环境下安装配置libSVM
  8. 云炬创业政策学习笔记20210111
  9. 科大星云诗社动态20210121
  10. [蓝桥小记]蓝桥杯参赛经历分享