亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

NULL,‘\0’和0之間的區別是什么?

NULL,‘\0’和0之間的區別是什么?

C
翻閱古今 2019-06-12 15:51:46
NULL,‘\0’和0之間的區別是什么?在C中,不同的零值之間似乎存在差異-NULL, NUL和0.我知道ASCII的角色'0'評估為48或0x30.這個NULL指針通常定義為:#define NULL 0或#define NULL (void *)0此外,還有NUL字'\0'這似乎是在評估0也是。這三種價值觀是否有不平等的時候?64位系統也是這樣嗎?
查看完整描述

3 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

這個答案適用于C語言,而不是C+。


空指針

整數常量文字0有不同的含義取決于使用它的上下文。在所有情況下,它仍然是一個整數常量,其值為0,只是用不同的方式來描述。

如果要將指針與常量文字進行比較,則為0,然后檢查指針是否為空指針。這,這個0則稱為空指針常量。C標準定義0轉換為類型void *是空指針和空指針常量。

此外,為了提高可讀性,宏NULL在頭文件中提供。stddef.h..根據編譯器的不同,#undef NULL把它重新定義為古怪的東西。

因此,下面是檢查空指針的一些有效方法:

if (pointer == NULL)

NULL定義為等于空指針。它是實現定義的實際定義。NULL只要它是一個有效的空指針常量。

if (pointer == 0)

0是空指針常量的另一個表示形式。

if (!pointer)

這,這個if語句隱式檢查“不是0”,因此我們將其反轉為“is 0”。

下面是檢查空指針的無效方法:

int mynull = 0;<some code>if (pointer == mynull)

對于編譯器來說,這不是對空指針的檢查,而是對兩個變量的相等檢查。這,這個強權如果mynull從未更改代碼,編譯器優化常量將0折疊到if語句中,則工作,但這并不一定,編譯器必須根據C標準至少生成一條診斷消息(警告或錯誤)。

注意,什么是C語言中的空指針。在底層架構上,這并不重要。如果底層體系結構有一個空指針值定義為地址0xDEADBEEF,那么就由編譯器來排序這個混亂。

因此,即使在這種有趣的體系結構中,以下方法仍然是檢查空指針的有效方法:

if (!pointer)if (pointer == NULL)if (pointer == 0)

下面是檢查空指針的無效方法:

#define MYNULL (void *) 0xDEADBEEFif (pointer == MYNULL)if (pointer == 0xDEADBEEF)

因為編譯器將這些看作是正常的比較。

空字符

'\0'定義為空字符-即將所有位設置為零的字符。這與指針無關。但是,您可能會看到類似于以下代碼的內容:

if (!*string_pointer)

檢查字符串指針是否指向空字符。

if (*string_pointer)

檢查字符串指針是否指向非空字符。

不要將這些與空指針混淆。僅僅因為位表示是相同的,而且這允許一些方便的交叉情況,它們實際上不是一回事。

此外,'\0'是一個整數常量(與所有字符文本一樣),在本例中為零。所以'\0'完全等同于未裝飾的0整數常量-唯一的區別是意圖它傳達給人類讀者(“我正在使用這個作為空字符。”)。

參考文獻

看見問題5.3.lang.c常見問題為了更多??匆?/trans>此pdf為C標準。請參閱6.3.2.3節的指針,第3段。


查看完整回答
反對 回復 2019-06-12
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

似乎有許多人誤解了NULL、‘\0’和0之間的區別。因此,為了解釋,并試圖避免重復早些時候說過的話:

值為0的int類型的常量表達式或此類型的表達式強制轉換為void*是空指針常數,如果轉換為指針,則該指針將成為空指針..用標準來保證比較不等于指向任何對象或函數的指針.

是宏,在空指針常數.

'\0'是用于表示空字符用于終止字符串。

空字符是將其所有位設置為0的字節。


查看完整回答
反對 回復 2019-06-12
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

這三個詞都在不同的上下文中定義了零的含義。

  • 指針上下文-NULL,它意味著指針的值是0,這與它是32位還是64位無關(一個是4個字節,另一個是8個字節的零)。
  • 字符串上下文-表示數字零的字符的十六進制值為0x30,而NUL字符的十六進制值為0x00(用于終止字符串)。

當您查看內存時,這三者總是不同的:

NULL - 0x00000000 or 0x00000000'00000000 (32 vs 64 bit)NUL - 0x00 or 0x0000 (ascii vs 2byte unicode)'0' - 0x20

我希望這能澄清這一點。


查看完整回答
反對 回復 2019-06-12
  • 3 回答
  • 0 關注
  • 1226 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號