C语言再学习 -- NUL和NULL的区别
NUL 是ASCII 字符集中 '\0' 字符的名字,它的字節(jié)模式為全 0。NULL 指一個(gè)其值為 0 的指針。它們都是整型值,其值也相同,所以它們可以互換使用。然而,你還是應(yīng)該使用適當(dāng)?shù)某A?#xff0c;因?yàn)樗芨嬖V閱讀程序的人不僅使用 0 這個(gè)值,而且告訴他使用這個(gè)值的目的。
符號(hào) NULL 在頭文件 staio.h 中定義。另一方面,并不存在預(yù)定義的符號(hào) NUL,所以如果你想使用它而不是字符常量 '\0',你必須自行定義。
NULL是一個(gè)宏,它在幾個(gè)標(biāo)準(zhǔn)頭文件中定義,0是一個(gè)整型常量,'\0'是一個(gè)字符常量,而NUL是一個(gè)字符常量的名字。這幾個(gè)術(shù)語都不可互換。
1、NULL用于表示什么也不指向,也就是空指針((void *)0)
2、0可以被用于任何地方,它是表示各種類型零值的符號(hào)并且編譯器會(huì)挑出它
3、'\0'應(yīng)該只被用于結(jié)束字符串
4、NUL沒有被定義于C和C++,它不應(yīng)該被使用,除非你自己定義它,像:#define nul '\0'
空指針:值是NULL , NULL可能是0,0L 或 (void*)0?
C 語言的定義,每一個(gè)指針類型,是一種特殊的值,空指針。 這與所有其他指針值區(qū)分開來,“保證不平等比作一個(gè)指針指向任何對(duì)象或函數(shù)”。也就是說,一個(gè)空指針應(yīng)該明確,它不是任何對(duì)象或函數(shù)的地址。取地址運(yùn)算符 & 永遠(yuǎn)不會(huì)產(chǎn)生一個(gè)空指針,也不會(huì)成功的調(diào)用 malloc。(malloc返回一個(gè)空指針則分配內(nèi)存失敗,這是一個(gè)典型的使用空指針,作為“特殊”指針值與其他意義,通常“不分配”或“沒有指向任何地方”)。
一個(gè)空指針概念上不同于未初始化的指針。一個(gè)空指針是已知不指向任何對(duì)象或函數(shù),未初始化的指針可能再任何地方。
正如上面提到的,有一個(gè)空指針對(duì)于每個(gè)指針類型,和內(nèi)部不同類型的空指針的值可能會(huì)有所不同。雖然程序員不需要知道內(nèi)部值,編譯器必須告知哪種類型的空指針是必需的,所以,如果有必要,需要區(qū)別對(duì)待。
空指針的用法?:
用空指針終止對(duì)遞歸數(shù)據(jù)結(jié)構(gòu)的間接引用?
用空指針作函數(shù)調(diào)用失敗時(shí)的返回值?
用空指針作警戒值?
注意,當(dāng)我們將 0 賦值給一個(gè)指針變量時(shí),絕對(duì)不能企圖使用該指針?biāo)赶虻膬?nèi)存中存儲(chǔ)的內(nèi)容。例如:
下面的寫法是完全合法的:
#include <stdio.h> #include <string.h>int main (void) {char p[20];if (p == (char*)0){printf ("1111111111\n");}printf ("222222222222\n");return 0; } 輸出結(jié)果: 222222222222 但是如果寫成這樣就非法了:
#include <stdio.h> #include <string.h>int main (void) {char p[20];if (strcmp (p, (char*)0) == 0){printf ("111111111111\n");}return 0; } 輸出結(jié)果: 段錯(cuò)誤 (核心已轉(zhuǎn)儲(chǔ)) #include <stdio.h> #include <string.h>int main (void) {char *p = NULL;printf ("%s\n", p);return 0; } 輸出結(jié)果: 段錯(cuò)誤 (核心已轉(zhuǎn)儲(chǔ)) 這部分可參看:C語言再學(xué)習(xí) -- 段錯(cuò)誤(核心已轉(zhuǎn)儲(chǔ))
NULL 指針并不指向任何對(duì)象。因此,除非是用于賦值或比較運(yùn)算,出于其他任何目的的使用NULL指針都是非法的。
總結(jié)
以上是生活随笔為你收集整理的C语言再学习 -- NUL和NULL的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网晚报 | 2月25日 星期五 |
- 下一篇: C语言再学习 -- 三字母词(转)