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

2021-07-13 09:43:36 字數 4543 閱讀 1342

首先,我們測試乙個程式:

#includeint main()

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

在c語言中,

null和0的值都是一樣的,但是為了目的和用途及容易識別的原因,

null用於指標和物件,0用於數值

對於字串的結尾,

使用'\0',它的值也是0

,但是讓人一看就知道這是

字串的結尾

,不是指標,也不是普通的數值

在不同的系統中,

null並非總是和0等同,null僅僅代表空值,也就是指向乙個不被使用的位址,在大多數系統中,都將0作為不被

使用的位址,所以就有了類似這樣的定義

#define null 0

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

解釋:問 0 '0' '\0' "\0"

to me, when doing c/c++:  

0 would digit zero, that is, a numerical value.0救贖數值0,常量值

'0' could be the character capital oh or the character zero. for example: char word[10] = "oxford"; char number[10] = "01234";

『0』可能是字元首部或者字元。例如,  char word[10] = "oxford"; char number[10] = "01234";

depending on typeface used 'o' may look exactly like '0' ****** it difficult to tell them apart out of context.

根據字型用「o」看起來像「0」,很難分辨出背景

'\0' is the null character used to terminate strings in c/c++.

『\

0』在c/c++中是空指標

"\0" is an empty string.

「\0」是乙個空字串

null在stdio.h中定義:

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

#ifdef __cplusplus

#define null 0

#else

#define null ((void *)0)

#endif

#endif

問題:

1、什麼是空指標常量 (null pointer constant) ?

an integer constant expression with the value 0, or such an expression cast to type void *, is called a null

pointer constant

乙個整型常量表示式的值0,或這樣的表示式轉換為 void*,被稱為空指標常量

這裡告訴我們:0、0l、『\0』、3-3、0*10 以及(void*)0 等都是空指標常量(注意 (char*) 0 不叫空指標常量,只是乙個空指標值)。至於系統選取哪種形式作為空指標常量使用,則是實現相關的。一般的 c 系統選擇 (void*)0 或者 0 的居多(也有個別的選擇 0l);至於 c++ 系統,由於存在嚴格的型別轉化的要求,void* 不能象 c 中那樣自由轉換為其它指標型別,所以通常選 0 作為空指標常量,而不選擇 (void*)0。

2、什麼是空指標(null pointer)?

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

因此,如果 p 是乙個指標變數,則 p = 0;、p = 0l;、p = '\0';、p = 3 - 3;、p = 0 * 10; 中的任何一種賦值操作之後(對於 c 來說還可以是 p = (void*)0;), p 都成為乙個空指標,由系統保證空指標不指向任何實際的物件或者函式。反過來說,任何物件或者函式的位址都不可能是空指標。

3、什麼是null?

the macro null is defined in (and other headers) as a null pointer constant

巨集觀的null定義在stddef.h或者其他標頭檔案裡,作為空指標常量

即null 是乙個標準規定的巨集定義,用來表示空指標常量。因此,除了上面的各種賦值方式之外,還可以用 p = null; 來使 p 成為乙個空指標。

4、空指標指向了記憶體哪個地方(空指標的內部實現)?

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

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

5、如何判斷乙個指標為空指標?

這可以通過與空指標常量或者其它的空指標的比較來實現(注意與空指標的內部表示無關)。例如,假設 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 )

//...

6、可以用memset函式來得到乙個空指標嗎?這個問題等同於:

如果 p 是乙個指標變數,那麼       memset( &p, 0, sizeof(p) );  和  p = 0;          是等價的嗎?

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

7、可以定義自己的 null 的實現嗎?兼答"null 的值可以是 1、2、3 等值嗎?"類似問題

null 是標準庫中的乙個符合上述條件的 reserved identifier (保留識別符號)。所以,如果包含了相應的標準標頭檔案

而引入了 null 的話,則再在程式中重新定義 null 為不同的內容是非法的,其行為是未定義的。也就是說,如果

是符合標準的程式,其 null 的值只能是 0,不可能是除 0 之外的其它值,比如 1、2、3 等。

8、malloc 函式在分配記憶體失敗時返回 0 還是 null?

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

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

**:

ICMP協議型別0和8區別

icmp協議型別 0和8的區別 0 回顯應答,表示回顯自己對別人的請求 8 回顯請求,表示回顯別人對自己的請求 下面用防火牆和ping命令來演示 iptables f iptables p input drop 設定預設input鏈規則為全部拒絕 iptables a input p icmp ic...

函式失敗返回 C語言函式返回1和返回0區別?

基本上,沒有人會將大段的c語言 全部塞入 main 函式,更好的做法是按照復用率高,耦合性低的原則,盡可能的將 拆分不同的功能模組,並封裝成函式。c語言 的組合千變萬化,因此函式的功能可能會比較複雜,不同的輸入,常常產生不同的輸出結果。不同的輸入,常常產生不同的輸出結果 c語言函式的返回值 c語言函...

c和c 的一點區別

1 c和c 的標頭檔案不同 c的標頭檔案 include c 的標頭檔案 include 2 輸入輸出不同 輸入 int i 10 c scanf d i 需要注意輸入的變數型別 c cin i 不需要注意變數型別 輸出 c printf d n i 需要注意輸出的變數型別 c cout 3 變數的...