C语言再学习 -- NUL和NULL的区别

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指针都是非法的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聚优致成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值