1. 程式人生 > >C語言再學習 -- NUL和NULL的區別

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;
}
輸出結果:
段錯誤 (核心已轉儲)
這部分可

NULL 指標並不指向任何物件。因此,除非是用於賦值或比較運算,出於其他任何目的的使用NULL指標都是非法的。