NULL和0的區別

2021-10-14 08:37:46 字數 4118 閱讀 3734

先看下面一段**輸出什麼:

#include

intmain()

輸出 ,單步除錯可以看出執行int *p=null,p的值為0x00000000,可以看出,null在實際底層呼叫中就是0

null和0的值都是一樣的,但是為了目的和用途及容易識別的原因,null用於指標和物件,0用於數值

對於字串的結尾,使用』\0』,它的值也是0,但是讓人一看就知道這是字串的結尾,不是指標,也不是普通的數值

null並非總是和0等同,null僅僅代表空值,也就是指向乙個不被使用的位址,在大多數系統中,都將0作為不被使用的位址,所以就有了類似這樣的定義

#define null 0

但並非總是如此,也有些系統不將0位址作為null,而是用其他的位址,所以說,千萬別將null和0等價起來,特別是在一些跨平台的**中,這更是將給你帶來災難。

看下面解釋:

問 0 『0』 『\0』 「\0」

對我來說,當做c/c++:

0時將數字為零,也就是乙個數值。

『0』可以是字元大寫哦,也可以是字元零。例如:char word[10]=「oxford」;char number[10]=「01234」;取決於所用的字型『o』可能看起來與『0』一模一樣,因此很難將它們從上下文中區分開來。

『\0』是用於終止c/c++中字串的空字元。「\0」是空字串

null在stdio.h中定義:

#if !defined(null) && defined(__needs_null)

#ifdef __cplusplus

#define null 0

#else

#define null ((void *)0)

#endif

#endif

在c++定義為0,在c中定義為(void *)0;為什麼,參考:

值為0的整數常量表示式或強制轉換為void*的表示式稱為空指標常量。

0、0l、』\0』、3 - 3、0 * 17 (它們都是「integer constant expression」)以及 (void*)0 (tyc: 我覺得(void*)0應該算是乙個空指標吧,更恰當一點)等都是空指標常量(注意 (char*) 0 不叫空指標常量,只是乙個空指標值)。至於系統選取哪種形式作為空指標常量使用,則是實現相關的。一般的 c 系統選擇 (void*)0 或者 0 的居多(也有個別的選擇 0l);至於 c++ 系統,由於存在嚴格的型別轉化的要求,void* 不能象 c 中那樣自由轉換為其它指標型別,所以通常選 0 作為空指標常量(tyc: c++標準推薦),而不選擇 (void*)0。

如果將空指標常量轉換為指標型別,則保證結果指標(稱為空指標)與指向任何物件或函式的指標不相等。

char p=0;此時p就是乙個空指標,不指向任何實際物件。

因此,如果 p 是乙個指標變數,則 p = 0;、p = 0l;、p = 『\0』;、p = 3 - 3;、p = 0 * 17; 中的任何一種賦值操作之後(對於 c 來說還可以是 p = (void)0;), p 都成為乙個空指標,由系統保證空指標不指向任何實際的物件或者函式。反過來說,任何物件或者函式的位址都不可能是空指標。(tyc: 比如這裡的(void*)0就是乙個空指標。把它理解為null pointer還是null pointer constant會有微秒的不同,當然也不是緊要了)

巨集null在(和其他標頭)中定義為空指標常量

即 null 是乙個標準規定的巨集定義,用來表示空指標常量。因此,除了上面的各種賦值方式之外,還可以用 p = null; 來使 p 成為乙個空指標。(tyc:很多系統中的實現:#define null (void*)0,與這裡的「a null pointer constant」並不是完全一致的)

標準並沒有對空指標指向記憶體中的什麼地方這乙個問題作出規定,也就是說用哪個具體的位址值(0x0 位址還是某一特定位址)表示空指標取決於系統的實現。我們常見的空指標一般指向 0 位址,即空指標的內部用全 0 來表示(zero null pointer,零空指標);也有一些系統用一些特殊的位址值或者特殊的方式表示空指標(nonzero null pointer,非零空指標),具體請參見c faq。

幸運的是,在實際程式設計中不需要了解在我們的系統上空指標到底是乙個 zero null pointer 還是 nonzero null pointer,我們只需要了解乙個指標是否是空指標就可以了——編譯器會自動實現其中的轉換,為我們遮蔽其中的實現細節。注意:不要把空指標的內部表示等同於整數 0 的物件表示——如上所述,有時它們是不同的。

這可以通過與空指標常量或者其它的空指標的比較來實現(注意與空指標的內部表示無關)。例如,假設 p 是乙個指標變數,q 是乙個同型別的空指標,要檢查 p 是否是乙個空指標,可以採用下列任意形式之一——它們在實現的功能上都是等價的,所不同的只是風格的差別。

指標變數 p 是空指標的判斷:

if ( p == 0 )

if ( p == 『\0』 )

if ( p == 3 - 3 )

if ( p == null ) /* 使用 null 必須包含相應的標準庫的標頭檔案 */

if ( null == p )

if ( !p )

if ( p == q )

…指標變數 p 不是空指標的判斷:

if ( p != 0 )

if ( p != 『\0』 )

if ( p != 3 - 3 )

if ( p != null ) /* 使用 null 必須包含相應的標準庫的標頭檔案 */

if ( null != p )

if ( p )

if ( p != q )

…這個問題等同於:如果 p 是乙個指標變數,那麼

memset( &p, 0, sizeof§ ); 和 p = 0;

是等價的嗎?

答案是否定的,雖然在大多數系統上是等價的,但是因為有的系統存在著「非零空指標」 (nonzero null pointer),所以這時兩者不等價。由於這個原因,要注意當想將指標設定為空指標的時候不應該使用 memset,而應該用空指標常量或空指針對指標變數賦值或者初始化的方法。

[7.1.3-2]如果程式在保留的上下文中宣告或定義識別符號(7.1.4允許的除外),或者將保留識別符號定義為巨集名稱,則行為未定義。

null 是標準庫中的乙個符合上述條件的 reserved identifier (保留識別符號)。所以,如果包含了相應的標準標頭檔案而引入了 null 的話,則再在程式中重新定義 null 為不同的內容是非法的,其行為是未定義的。也就是說,如果是符合標準的程式,其 null 的值只能是 0,不可能是除 0 之外的其它值,比如 1、2、3 等。

malloc 函式是標準 c 規定的庫函式。在標準中明確規定了在其記憶體分配失敗時返回的是乙個 「null pointer」(空指標):

如果空間無法分配,則返回空指標

對於空指標值,一般的文件(比如 man)中傾向於用 null 表示,而沒有直接說成 0。但是我們應該清楚:對於指標型別來說,返回 null 和 返回 0 是完全等價的,因為 null 和 0 都表示 「null pointer」(空指標)。(tyc:一般系統中手冊中都返回null,那我們就用null吧)

\0是c++中字串的結尾標誌,儲存在字串的結尾。比如char cha[5]表示可以放5個字元的字串,由於c/c++中規定字串的結尾標誌為』\0』,它雖然不計入串長,但要佔記憶體空間,而乙個漢字一般用兩個位元組表示,且c/c++中如乙個陣列cha[5],有5個變數,分別是 cha[0] , cha[1] , cha[2] , cha[3] , cha[4] , 所以cha[5]可以放5個字母或者放2個漢字(1個漢字佔2個位元組,1個字母佔乙個位元組),cha[5]佔5個位元組記憶體空間.

char str[5]

; str[0]

='a'

; str[1]

='b'

; str[2]

='c'

; str[3]

='d'

;//str[4]='\0'; //abcd

str[4]

='e'

;/*這樣輸出就是abcde和一堆亂碼,甚至跳出系統錯誤,因為沒有字串結尾符*/

printf

("%s"

,str)

;

NULL和0的區別

在c語言中,null和0的值都是一樣的,但是為了目的和用途及容易識別的原因,null用於指標和物件,0用於數值。對於字串的結尾,使用 0 它的值也是0,但是讓人一看就知道這是字串的結尾,不是指標,也不是普通的數值。在不同的系統中,null並非總是和0等同,null僅僅代表空值,也就是指向乙個不被使用...

c語言NULL和0區別及NULL詳解

首先,我們測試乙個程式 includeint main 輸出,單步除錯可以看出執行int p null,p的值為0x00000000,可以看出,null在實際底層呼叫中就是0 在c語言中,null和0的值都是一樣的,但是為了目的和用途及容易識別的原因,null用於指標和物件,0用於數值 對於字串的結...

php中0, ,null和false的區別

php中很多還不懂php中0,null和false之間的區別,這些區別有時會影響到資料判斷的正確性和安全性,給程式的測試執行造成很多麻煩。先看乙個例子 str1 null str2 false echo str1 str2 相等 不相等 str3 str4 0 echo str3 str4 相等 不...