指標空值nullptr C 11

2021-10-01 06:59:45 字數 1723 閱讀 6294

本篇部落格會寫c++11標準的中的乙個新特性nullptr,並解釋它的使用方法。

在我們平時宣告乙個變數時,一般會給變數乙個初始值,例如:

void

testptr()

這個null實際上就是乙個巨集,在傳統的c標頭檔案(stddef.h)中:

#ifndef null

#ifdef __cplusplus

#define null 0

//被定義為0

#else

#define null ((void *)0)

//被定義為無型別指標(void*)的常量

#endif

#endif

可以看到,null可能被定義為字面常量0,或者被定義為無型別指標(void*)的常量。不論採取何種定義,在

使用空值的指標時,都不可避免的會遇到一些麻煩 。比如:

voidf(

int)

voidf(

int*

)int

mian()

執行結果如下:

結果可能和我們想的有些不同,這就是問題所在。f(0)我們肯定知道會呼叫第乙個函式,但是f(null)我們覺得它會呼叫第二個函式,因為它傳的是乙個指標,但是結果卻是呼叫了第乙個函式,因為null被定義為了字面常量0,編譯器預設情況下將null看做乙個整型常量,如果要將其按照指標方式使用,必須對其強轉成(void*)0,所以c++11中引入nullptr。

voidf(

int)

voidf(

int*

)int

mian()

這個時候執行結果就是和我們想的一樣了

為了考慮相容性,c++11並沒有消除常量0的二義性,c++11給出了全新的nullptr表示空值指標。c++11為什麼不在null的基礎上進行擴充套件,這是因為null以前就是乙個巨集,而且不同的編譯器廠商對於null的實現可能不太相同,而且直接擴充套件null,可能會影響以前舊的程式。因此為了避免混淆,c++11提供了nullptr即nullptr代表乙個指標空值常量。nullptr是有型別的,其型別為nullptr_t,僅僅可以被隱式轉化為指標型別,nullptr_t被定義在標頭檔案中:

typedef

decltype

(nullptr

) nullptr_t;

我們直接看一看nullptr的型別會更加直觀

int

main()

可以得到nullptr的型別是nullptr_t,是在標準庫標頭檔案裡的。

有三點需要注意:

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

2.在c++11中,sizeof(nullptr) 與 sizeof((void*)0)所佔的位元組數相同。

3.為了提高**的健壯性,在後續表示指標空值時建議最好使用nullptr。

CPP11新特性 指標空值nullptr

在良好的c c 程式設計習慣中,宣告乙個變數時最好給該變數乙個合適的初始值,否則可能會出現不可預料的錯誤,比如未初始化的指標。如果乙個指標沒有合法的指向,我們基本就是按照如下方式對其進行初始化 void testptr null實際是乙個巨集,在傳統的c標頭檔案 stdef.h 中,可以看到如下 i...

C 指標空值nullptr

在良好的c c 程式設計習慣中,宣告乙個變數時應該給該變數乙個合適的初始值,否則可能會出現不可預料的錯誤,比如未初始化的指標。如果乙個指標沒有合法的指向,我們基本都是按照如下方式對其進行初始化 void testptr null實際是乙個巨集。null可能被定義為字面常量0,或者被定義為無型別指標 ...

C 11 智慧型指標和空指標

nullptr 空指標是不會指向有效資料的指標,以前用 0表示,但是這使得 0既可表示指標常量,又可表示整型常量。c 11 仍允許使用 0來表示空指標,因此表示式 nullptr 0 為true 使用nullptr 表示空指標而不是 0提供了更高的型別安全。智慧型指標 如果指標 ps有乙個析構函式,...