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