欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++深入探究用NULL來初始化空指針是否合適

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

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

1.C++98中的空指針

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

指針的危險性

在C++中創(chuàng)建指針時,計算機將分配用來存儲地址的內(nèi)存,但不會分配用來存儲指針所指向的的數(shù)據(jù)的內(nèi)存。為數(shù)據(jù)提供空間的是一個獨立的步驟,忽略這一步無疑是自找麻煩的,如下所示:

int* fellow;
*fellow = 1234;

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

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

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

實際上NULL是一個宏,我們在傳統(tǒng)的C頭文件(stddef.h)中就可以看到如下代碼:

可以看到, NULL 可能被定義為字面常量 0 ,或者被定義為無類型指針 (void*) 的常量 。不論采取何種定義,在使用空值的指針時,都不可避免的會遇到一些麻煩。 比如:下面這段代碼的輸出結(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)應該進入void f (int),f(NULL)進入void f(int*),因此我們想要得到的結(jié)果是分別打印f(int)和f(int*)。我們來看運行結(jié)果是否和我們所想的一樣。

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

這是因為程序本意是想通過f(NULL)調(diào)用指針版本的f(int*)函數(shù),但是由于NULL被宏定義成了0,在預處理階段,NULL已經(jīng)被宏替換成了0,因此f(NULL)函數(shù)就已經(jīng)被替換成了f(0),因此我們才會得到兩個相同的打印結(jié)果。

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

2.C++11中的空指針

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

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

因此我們再次傳入nullptr,看看他的結(jié)果是什么?

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

注意:

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

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

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

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

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

相關(guān)文章

  • C++?點(.)和箭頭(->)運算符用法小結(jié)

    C++?點(.)和箭頭(->)運算符用法小結(jié)

    在C++中,點運算符(.)用于訪問類的成員變量和成員函數(shù),而箭頭運算符(->)用于通過指針訪問類的成員變量和成員函數(shù),本文就來詳細的介紹一下如何使用,感興趣的可以了解一下
    2024-01-01
  • C++ 實戰(zhàn)開發(fā)一個猜單詞的小游戲

    C++ 實戰(zhàn)開發(fā)一個猜單詞的小游戲

    眾所周知紙上得來終覺淺,我們要在實戰(zhàn)中才能真正的掌握技術(shù),小編為大家?guī)硪环萦肅++編寫的猜單詞小游戲,給大家練練手,快來看看吧
    2021-11-11
  • 詳解C語言學習記錄之指針

    詳解C語言學習記錄之指針

    關(guān)于指針,其是C語言的重點,C語言學的好壞,其實就是指針學的好壞。其實指針并不復雜,學習指針,要正確的理解指針,本片文章能給就來學習一下
    2021-11-11
  • C語言基于graphics.h實現(xiàn)圣誕樹

    C語言基于graphics.h實現(xiàn)圣誕樹

    這篇文章主要介紹了圣誕樹代碼,c語言編程,基于graphics.h實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C++實現(xiàn)中綴表達式轉(zhuǎn)化為后綴表達式詳解

    C++實現(xiàn)中綴表達式轉(zhuǎn)化為后綴表達式詳解

    這篇文章主要為大家詳細介紹了如何利用C++解決實現(xiàn)中綴表達式轉(zhuǎn)換為后綴表達式的問題,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言中二級指針的實例詳解

    C語言中二級指針的實例詳解

    這篇文章主要介紹了C語言中二級指針的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握理解二級指針的知識,需要的朋友可以參考下
    2017-10-10
  • C語言實現(xiàn)順序表的全操作詳解

    C語言實現(xiàn)順序表的全操作詳解

    順序表,全名順序存儲結(jié)構(gòu),是線性表的一種,線性表用于存儲邏輯關(guān)系為“一對一”的數(shù)據(jù),順序表自然也不例外,不僅如此,順序表對數(shù)據(jù)的物理存儲結(jié)構(gòu)也有要求,跟隨下文來具體了解吧
    2022-04-04
  • QT 如何實現(xiàn)時間的獲取

    QT 如何實現(xiàn)時間的獲取

    這篇文章主要介紹了QT 如何實現(xiàn)時間的獲取,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • C++線程安全的單例模式講解

    C++線程安全的單例模式講解

    今天小編就為大家分享一篇關(guān)于C++線程安全的單例模式講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C語言用遞歸函數(shù)對素數(shù)進行判斷流程

    C語言用遞歸函數(shù)對素數(shù)進行判斷流程

    素數(shù)判斷是編程語言學習過程中一個老生常談的話題,而它的實現(xiàn)也有多種算法,包括經(jīng)典的試除法(以及試除法的幾種優(yōu)化),進階的素數(shù)表篩選法,埃拉托斯特尼篩法和歐拉篩法(以及它們的優(yōu)化)等。對以上算法感興趣的朋友們,不妨搜索“素數(shù)判斷的N種境界”來學習了解
    2022-09-09

最新評論