第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

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

3 回答

?
溫溫醬

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊

這個(gè)答案適用于C語(yǔ)言,而不是C+。


空指針

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

如果要將指針與常量文字進(jìn)行比較,則為0,然后檢查指針是否為空指針。這,這個(gè)0則稱為空指針常量。C標(biāo)準(zhǔn)定義0轉(zhuǎn)換為類型void *是空指針和空指針常量。

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

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

if (pointer == NULL)

NULL定義為等于空指針。它是實(shí)現(xiàn)定義的實(shí)際定義。NULL只要它是一個(gè)有效的空指針常量。

if (pointer == 0)

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

if (!pointer)

這,這個(gè)if語(yǔ)句隱式檢查“不是0”,因此我們將其反轉(zhuǎn)為“is 0”。

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

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

對(duì)于編譯器來說,這不是對(duì)空指針的檢查,而是對(duì)兩個(gè)變量的相等檢查。這,這個(gè)強(qiáng)權(quán)如果mynull從未更改代碼,編譯器優(yōu)化常量將0折疊到if語(yǔ)句中,則工作,但這并不一定,編譯器必須根據(jù)C標(biāo)準(zhǔn)至少生成一條診斷消息(警告或錯(cuò)誤)。

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

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

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

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

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

因?yàn)榫幾g器將這些看作是正常的比較。

空字符

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

if (!*string_pointer)

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

if (*string_pointer)

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

不要將這些與空指針混淆。僅僅因?yàn)槲槐硎臼窍嗤?,而且這允許一些方便的交叉情況,它們實(shí)際上不是一回事。

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

參考文獻(xiàn)

看見問題5.3.lang.c常見問題為了更多??匆?/trans>此pdf為C標(biāo)準(zhǔn)。請(qǐng)參閱6.3.2.3節(jié)的指針,第3段。


查看完整回答
反對(duì) 回復(fù) 2019-06-12
?
眼眸繁星

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊

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

值為0的int類型的常量表達(dá)式或此類型的表達(dá)式強(qiáng)制轉(zhuǎn)換為void*是空指針常數(shù),如果轉(zhuǎn)換為指針,則該指針將成為空指針..用標(biāo)準(zhǔn)來保證比較不等于指向任何對(duì)象或函數(shù)的指針.

是宏,在空指針常數(shù).

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

空字符是將其所有位設(shè)置為0的字節(jié)。


查看完整回答
反對(duì) 回復(fù) 2019-06-12
?
慕仙森

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊

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

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

當(dāng)您查看內(nèi)存時(shí),這三者總是不同的:

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

我希望這能澄清這一點(diǎn)。


查看完整回答
反對(duì) 回復(fù) 2019-06-12
  • 3 回答
  • 0 關(guān)注
  • 1224 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)