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 是乙個標準規定的巨集定義,用來表示空指標常...