空指標 從 0 到 NULL,再到 nullptr

2021-09-29 12:34:15 字數 1776 閱讀 9337

nullptr

null 是乙個巨集定義:

#undef null

#if defined(__cplusplus)

#define null 0

#else

#define null ((void *)0)

#endif

int *my_ptr = 0;

int *my_ptr = null;

// null 的問題

#include void f(char *c)

void f(int i)

int main()

/* * 使用 xlc 編譯器會得到如下結果:

* invoke f(int)

* invoke f(int)

* invoke f(char*)

* xlc 將 null 定義為了 0

*/

引起該問題的原因是 0 的二義性。0 既可以表示整型,也可以表示乙個 空指標(void *)。存在二義性時,需要使用強制型別轉換:((void *)0).

雖然 g++ 編譯器將 null 轉換為編譯器內部識別符號(__null),並在編譯時期進行了分析,在一定程度上可以緩解問題,但是會帶來**移植的限制。

// 標頭檔案: cstddef

typedef decltype(nullptr) nullptr_t;

/* 使用 nullptr_t 必須包含標頭檔案: cstddef。

使用 nullptr 則不需要

*/

nullptr 最大的優勢是 有型別,且可以被隱式轉換為指標型別。

#include void f(char *c) 

void f(int i)

int main()

c++11 不僅定義了空指標常量 nullptr,也定義了 空指標型別 nullptr_t。那麼也就是說 nullptr_t 可以用來定義變數。通常,可以使用 nullptr_t 宣告乙個 空指標變數。

#include #include using namespace std;

int main()

else

if (nptr < nullptr) else

// 不能轉換為整型或 bool 型別

// if (0 == nullptr);

// if (nullptr);

// 不可以進行算術運算

// nullptr += 1;

// nullptr * 5;

// 以下操作均可以正常執行

sizeof(nullptr);

typeid(nullptr);

throw(nullptr);

return 0;

}

雖然 nullptr_t 看起來像是乙個 指標型別,但是在把 nullptr_t 應用於模板時,我們發現模板卻只能把他作為乙個普通的型別來推導。(並不會將其視為 t* 指標)

using namespace std;

templatevoid g(t* t) {}

templatevoid h(t t) {}

int main()

#include #include using namespace std;

int main()

C 空指標 NULL 與0的區別

空指標常量,ansi規定 規定預處理巨集null 為空指標常量,通常 define null 0或 void 0 誤區 有的機器不同型別的指標使用不同的內部表示,例如將字元指標的空指標常量定義為 define null char 0 這樣的null定義對於接受字元指標的函式沒有問題,但對於其他型別的...

C C 的空指標,NULL,0和nullptr

在c和c 中,null和0都可以使用。c通常使用null,c 通常使用0 include int main void include using namespace std int main 1 void foo char 2 int main void foo int 1 void foo cha...

c c 中空指標,空指標常量,NULL

如何是乙個指標變數成為空指標 如果 p 是乙個指標變數,則 p 0 p 0l p 0 p 3 3 p 0 17 中的任何一種賦值操作之後 對於 c 來說還可以是 p void 0 p 都成為乙個空指標,由系統保證空指標不指向任何實際的物件或者函式。null 是乙個標準規定的巨集定義,用來表示空指標常...