最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++深入探究用NULL來(lái)初始化空指針是否合適

 更新時(shí)間:2022年05月16日 10:35:00   作者:小白又菜  
在C++11新特性中,我們用nullptr來(lái)表示指針空值,這是為什么呢?好好地NULL為什么不繼續(xù)使用呢?說(shuō)明在創(chuàng)造C++的大佬們一定發(fā)現(xiàn)了什么Bug,本篇我們就一起來(lái)討論一下吧

我們要了解C++11新特性的nullptr,我們很有必要先了解一下C++11之前的程序員是怎么使用空指針的。

1.C++98中的空指針

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

指針的危險(xiǎn)性

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

int* fellow;
*fellow = 1234;

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

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

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

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

可以看到, NULL 可能被定義為字面常量 0 ,或者被定義為無(wú)類(lèi)型指針 (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*)。我們來(lái)看運(yùn)行結(jié)果是否和我們所想的一樣。

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

這是因?yàn)槌绦虮疽馐窍胪ㄟ^(guò)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ù)字,也可以是無(wú)類(lèi)型的指針 (void*) 常量,但是編譯器默認(rèn)情況下將其看成是一個(gè)整形常量,如果要將其按照指針?lè)绞絹?lái)使用,必須對(duì)其進(jìn)行強(qiáng)轉(zhuǎn)(void *)0 。

2.C++11中的空指針

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

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

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

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

注意:

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。

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

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

到此這篇關(guān)于C++深入探究用NULL來(lái)初始化空指針是否合適的文章就介紹到這了,更多相關(guān)C++ 空指針初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++文件的操作及小實(shí)驗(yàn)示例代碼詳解

    C++文件的操作及小實(shí)驗(yàn)示例代碼詳解

    這篇文章主要介紹了C++文件的操作及小實(shí)驗(yàn),對(duì)于文件,它是一個(gè)流對(duì)象,對(duì)文件的操作無(wú)非是讀和寫(xiě),通過(guò)本文的學(xué)習(xí)大家將會(huì)理解文件的具體操作
    2022-05-05
  • C語(yǔ)言逆向分析語(yǔ)法超詳細(xì)分析

    C語(yǔ)言逆向分析語(yǔ)法超詳細(xì)分析

    這篇文章主要介紹了C語(yǔ)言逆向分析語(yǔ)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • 關(guān)于C語(yǔ)言文件操作方法

    關(guān)于C語(yǔ)言文件操作方法

    這篇文章主要介紹了關(guān)于C語(yǔ)言文件操作方法的相關(guān)資料,需要的朋友可以參考下
    2018-03-03
  • C語(yǔ)言中的多行輸入問(wèn)題及說(shuō)明

    C語(yǔ)言中的多行輸入問(wèn)題及說(shuō)明

    這篇文章主要介紹了C語(yǔ)言中的多行輸入問(wèn)題及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++零基礎(chǔ)精通數(shù)據(jù)結(jié)構(gòu)之帶頭雙向循環(huán)鏈表

    C++零基礎(chǔ)精通數(shù)據(jù)結(jié)構(gòu)之帶頭雙向循環(huán)鏈表

    帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個(gè)結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會(huì)發(fā)現(xiàn)結(jié)構(gòu)會(huì)帶來(lái)很多優(yōu)勢(shì),實(shí)現(xiàn)反而簡(jiǎn)單
    2022-03-03
  • C語(yǔ)言的隨機(jī)數(shù)rand()函數(shù)詳解

    C語(yǔ)言的隨機(jī)數(shù)rand()函數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的隨機(jī)數(shù)rand()函數(shù),使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C語(yǔ)言進(jìn)程程序替換的實(shí)現(xiàn)詳解

    C語(yǔ)言進(jìn)程程序替換的實(shí)現(xiàn)詳解

    為什么要進(jìn)程替換?因?yàn)楦高M(jìn)程創(chuàng)建出來(lái)的子進(jìn)程和父進(jìn)程擁有相同的代碼段,所以,子進(jìn)程看到的代碼和父進(jìn)程是一樣的。當(dāng)我們想要讓子進(jìn)程執(zhí)行不同的程序時(shí)候,就需要讓子進(jìn)程調(diào)用進(jìn)程程序替換的接口,從而讓子進(jìn)程執(zhí)行不一樣的代碼
    2022-08-08
  • C++分析講解類(lèi)的靜態(tài)成員變量是什么

    C++分析講解類(lèi)的靜態(tài)成員變量是什么

    在C++中,靜態(tài)成員是屬于整個(gè)類(lèi)的而不是某個(gè)對(duì)象,靜態(tài)成員變量只存儲(chǔ)一份供所有對(duì)象共用。所以在所有對(duì)象中都可以共享它。使用靜態(tài)成員變量實(shí)現(xiàn)多個(gè)對(duì)象之間的數(shù)據(jù)共享不會(huì)破壞隱藏的原則,保證了安全性還可以節(jié)省內(nèi)存
    2022-04-04
  • C++實(shí)現(xiàn)圖書(shū)管理系統(tǒng)簡(jiǎn)易版

    C++實(shí)現(xiàn)圖書(shū)管理系統(tǒng)簡(jiǎn)易版

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書(shū)管理系統(tǒng)簡(jiǎn)易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言使用ffmpeg和sdl實(shí)現(xiàn)多路音頻播放

    C語(yǔ)言使用ffmpeg和sdl實(shí)現(xiàn)多路音頻播放

    這篇文章主要為大家詳細(xì)介紹了一種基于ffmpeg和sdl實(shí)現(xiàn)的音頻多路混合的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2023-06-06

最新評(píng)論

兰州市| 秭归县| 富民县| 淮南市| 普兰县| 绥江县| 宜君县| 炎陵县| 夏邑县| 饶平县| 曲阜市| 富民县| 蒙城县| 广西| 新蔡县| 封开县| 徐州市| 井陉县| 华蓥市| 新宾| 习水县| 开鲁县| 全州县| 天津市| 麦盖提县| 义马市| 句容市| 陆丰市| 洞头县| 麦盖提县| 门源| 精河县| 曲水县| 淳安县| 云安县| 昂仁县| 西贡区| 延寿县| 察隅县| 工布江达县| 分宜县|