溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++用NULL來初始化空指針合適嗎

發(fā)布時(shí)間:2022-05-16 13:45:36 來源:億速云 閱讀:114 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“C++用NULL來初始化空指針合適嗎”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1.C++98中的空指針

我們知道,在良好的C/C++編程習(xí)慣中,聲明一個(gè)變量時(shí)最好給這個(gè)變量賦一個(gè)合適的初始值,否則就有可能出現(xiàn)不可預(yù)料的錯(cuò)誤。

指針的危險(xiǎn)性

在C++中創(chuàng)建指針時(shí),計(jì)算機(jī)將分配用來存儲(chǔ)地址的內(nèi)存,但不會(huì)分配用來存儲(chǔ)指針?biāo)赶虻牡臄?shù)據(jù)的內(nèi)存。為數(shù)據(jù)提供空間的是一個(gè)獨(dú)立的步驟,忽略這一步無疑是自找麻煩的,如下所示:

int* fellow;
*fellow = 1234;

fellow確實(shí)是一個(gè)指針,但它指向哪里呢?上述代碼沒有將地址賦給fellow,那么1234將被放置在哪個(gè)內(nèi)存單元呢?我們并不知道。有fellow沒有被初始化,他可能有任何值。不管值是什么,程序都將他解釋為存儲(chǔ)1234的地址。但是如果fellow的值碰巧為1000,計(jì)算機(jī)將把數(shù)據(jù)放在地址1000上,即使這恰巧是程序代碼的地址,fellow指向的地方很可能并不是所要存儲(chǔ)的1234的地方,這種錯(cuò)誤可能會(huì)導(dǎo)致一些最隱匿,最難以跟蹤的bug。

因此為了避免這個(gè)問題,我們都要給指針進(jìn)行初始化。通常我們都是這樣來初始化指針的。

int main()
{
	//空指針定義
	int* p1 = NULL;
	int* p2 = 0;
	return 0;
}

實(shí)際上NULL是一個(gè)宏,我們?cè)趥鹘y(tǒng)的C頭文件(stddef.h)中就可以看到如下代碼:

C++用NULL來初始化空指針合適嗎

可以看到, NULL 可能被定義為字面常量 0 ,或者被定義為無類型指針 (void*) 的常量 。不論采取何種定義,在使用空值的指針時(shí),都不可避免的會(huì)遇到一些麻煩。 比如:下面這段代碼的輸出結(jié)果是什么?

void f(int)
{
	cout << "f(int)" << endl;
}
void f(int*)
{
	cout << "f(int*)" << endl;
}
int main()
{
	//空指針定義
	int* p1 = NULL;
	int* p2 = 0;
	f(0);
	f(NULL);
	return 0;
}

按照我們正常的想法f(0)應(yīng)該進(jìn)入void f (int),f(NULL)進(jìn)入void f(int*),因此我們想要得到的結(jié)果是分別打印f(int)和f(int*)。我們來看運(yùn)行結(jié)果是否和我們所想的一樣。

C++用NULL來初始化空指針合適嗎

我們發(fā)現(xiàn)運(yùn)行結(jié)果和我們所想存在出入,這是為什么?

這是因?yàn)槌绦虮疽馐窍胪ㄟ^f(NULL)調(diào)用指針版本的f(int*)函數(shù),但是由于NULL被宏定義成了0,在預(yù)處理階段,NULL已經(jīng)被宏替換成了0,因此f(NULL)函數(shù)就已經(jīng)被替換成了f(0),因此我們才會(huì)得到兩個(gè)相同的打印結(jié)果。

在 C++98 中,字面常量 0 既可以是一個(gè)整形數(shù)字,也可以是無類型的指針 (void*) 常量,但是編譯器默認(rèn)情況下將其看成是一個(gè)整形常量,如果要將其按照指針方式來使用,必須對(duì)其進(jìn)行強(qiáng)轉(zhuǎn)(void *)0 。

2.C++11中的空指針

為了避免上述這個(gè)問題,C++11引入了nullptr關(guān)鍵字來表示指針空值。

int main()
{
	//空指針定義
	int* p1 = NULL;
	int* p2 = 0;
	//推薦
	int* p3 = nullptr;
	f(0);
	f(NULL);
	f(nullptr);
	return 0;
}

因此我們?cè)俅蝹魅雗ullptr,看看他的結(jié)果是什么?

C++用NULL來初始化空指針合適嗎

此時(shí)我們發(fā)現(xiàn)nullptr解決了這個(gè)問題。

注意:

1. 在使用 nullptr 表示指針空值時(shí),不需要包含頭文件,因?yàn)?nullptr 是 C++11 作為新關(guān)鍵字引入的 。

2. 在 C++11 中, sizeof(nullptr) 與 sizeof((void*)0) 所占的字節(jié)數(shù)相同。 在32位機(jī)器下大小為4,在64位下大小為8。

C++用NULL來初始化空指針合適嗎

3. 為了提高代碼的健壯性,在后續(xù)表示指針空值時(shí)建議最好使用 nullptr 。

結(jié)論:nullptr是對(duì)NULL的一個(gè)升級(jí),因此在以后的初始化空指針時(shí),建議大家使用nullptr。

“C++用NULL來初始化空指針合適嗎”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI