中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2022-05-16 13:45:36 來源:億速云 閱讀:115 作者:iii 欄目:開發技術

本篇內容介紹了“C++用NULL來初始化空指針合適嗎”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1.C++98中的空指針

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

指針的危險性

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

int* fellow;
*fellow = 1234;

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

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

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

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

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

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

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*),因此我們想要得到的結果是分別打印f(int)和f(int*)。我們來看運行結果是否和我們所想的一樣。

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

我們發現運行結果和我們所想存在出入,這是為什么?

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

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

2.C++11中的空指針

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

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

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

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

此時我們發現nullptr解決了這個問題。

注意:

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

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

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

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

普格县| 蓬溪县| 尼勒克县| 崇信县| 斗六市| 乐亭县| 秀山| 通城县| 儋州市| 泰宁县| 城市| 纳雍县| 东阿县| 格尔木市| 沙洋县| 屯门区| 玉环县| 时尚| 文水县| 芷江| 定安县| 都昌县| 宁津县| 临湘市| 英德市| 黔西县| 东源县| 万州区| 罗甸县| 靖远县| 两当县| 秭归县| 成都市| 赣州市| 安溪县| 奇台县| 宣恩县| 奉化市| 榕江县| 靖宇县| 威信县|