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指針都是非法的。
總結
以上是生活随笔為你收集整理的C语言再学习 -- NUL和NULL的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网晚报 | 2月25日 星期五 |
- 下一篇: C语言再学习 -- 三字母词(转)