c++中空指標的值是0。c++98, c++03, c++11, c++14, c++17... 永遠也不會改變這個知識點。
但是0是個文字量,沒有可攜式別資訊。
void foo(int);
void foo(char*);
foo(0); //根據直覺,好像應該呼叫foo(int),實際也是如此。
0和空指標的關係是:空指標的值是0;而0不一定是空指標(還可能是整數0)
c語言中,有乙個很明確的空指標null。其定義為#define null ((void*)0)。在c語言裡,null和0有著本質區別,null是有型別的(void*)!
c語言裡,null和空指標的關係是:空指標的值是null,而null就是空指標。
foo(null); //c語言角度看這句話,根據直覺,null是空指標,應呼叫void foo(char*);,實際也是如此。
foo(0); //c語言角度看這句話,根據直覺,應呼叫void foo(int);,實際也是如此。
c++出現後,情況有了惡化。在c++語言中null被定義成0,而不是((void*)0)
因為 char* p = ((void*)0); 在c++中編譯不過去,c++禁止void*隱式轉換成其它指標,c++認為這是pitfall,是陷阱。不能為了一點小利而飲鴆止渴。
foo(null); //c++語言角度看這句話,巨集展開是foo(0),實際呼叫foo(int),完全不符合直覺,按照c語言習慣思考的程式設計師將可能遇到乙個大bug。
沒有吃過虧人的,自然對null這個東西無所謂,吃過虧的人自然對null很不爽。因此要尋求完善,尋求改進。
雖然在字面上null能提示程式設計師們這是空指標,但是對計算機編譯器,null與整數0沒什麼區別。編譯器不知道null是空指標!!!!!
c++引入nullptr表示空指標,這是乙個一等類的乙個全域性物件,占有儲存空間,有自己的身份型別nullptr_t。
foo(nullptr); //現在,呼叫foo(char*),直覺完全符合實際!!
nullptr有個神奇的功能,它能轉換為任何型別的空指標。
char* p1 = nullptr; //好像是執行這句 char* p1 = (char*)0;
std::vector* p2 = nullptr; //好像是執行這句 std::vector* p2= (std::vector*)0;
其實只是用了簡單的模板成員函式,利用了模板的一點小威力。
classnullptr_t
};
為什麼不需要在使用nullptr時,引入對應的標頭檔案呢?
顯然c++編譯器已經預置支援nullptr_t型別和null_ptr全域性物件了。
相似的現象還有std::initializer_list,也是從語言層面引入的乙個c++一等型別。
C 11 新特性 nullptr 學習
nullptr 出現的目的是為了替代 null。在某種意義上來說,傳統 c 會把 null 0 視為同一種東西,這取決於編譯器如何定義 null,有些編譯器會將 null 定義為 void 0 有些則會直接將其定義為 0。c 不允許直接將 void 隱式轉換到其他型別,但如果 null 被定義為 v...
C 為啥引入nullptr
考慮著這樣乙個函式過載的情形 include void foo int 1 void foo char 2 int main 從字面上來講,null是個空指標常量,我們可能會覺得 既然是個指標,那麼應該呼叫 2。但事實上呼叫的卻是 1,因為c 中null擴充套件為常數0,它是int型。根本原因就是 ...
NULL和nullptr的區別
null是0 nullptr是空指標void include void go int num void go char p void main 在看例子就比較清晰了 void go int num void go void p int main 結果 1 在c語言中null代表空指標。例如 int ...