日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ NULL nullptr和0的区别

發布時間:2024/9/30 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ NULL nullptr和0的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C中的NULL

在C語言中我們將NULL用作空指針之用,NULL在C語言中的定義如下:

#define NULL ((void *)0)

可以看到,C語言中NULL是一個void*指針,我們常用其來對指針變量進行初始化賦值或者作為返回類型為指針的函數的返回值(如函數執行失敗時)等等。

C++中的NULL

在C++中,NULL的定義如下:

/* Define NULL pointer value */ #ifndef NULL#ifdef __cplusplus#define NULL 0#else /* __cplusplus */#define NULL ((void *)0)#endif /* __cplusplus */ #endif /* NULL */

可以看到,在C++中,NULL被定義為0,而不是(void*)0,為什么C++在NULL的定義上不繼續兼容C延續(void*)0的定義呢?因為C++中不能將void類型的指針隱式轉換成其他指針類型,所以將NULL定義為(void)0的話并不能起到空指針的作用.

因為C++中不能將void類型的指針隱式轉換成其他指針類型,所以用(void)0對其他類型指針賦初值是不行的。既然(void*)0不能起到空指針的作用,不如干脆將NULL定義為0,引入0來表示空指針,可以對各種類型的指針進行賦值。

C++中的nullptr

C++中有個nullptr的關鍵字可以用作空指針,既然已經有了定義為0的NULL,為何還要nullptr呢?這是因為定義為0的NULL很容易引起混淆,尤其是函數重載調用時.

void hello(char* a) {printf("char\n"); } void hello(int a) {printf("int\n"); }int main() {hello(NULL; //調用hello(int a)函數return 0; }

如果在C++中還是用NULL來用作空指針的話,我們會以為hello(NULL)調用的是hello(char* a),但實際上,因為NULL定義為0,所以調用的是hello(int a)。所以為了避免這種混淆,C++定義了nullptr關鍵字用作空指針。

nullptr的使用
nullptr關鍵字用于標識空指針,是std::nullptr_t類型的(constexpr)變量。它可以轉換成任何指針類型和bool布爾類型(主要是為了兼容普通指針可以作為條件判斷語句的寫法),但是不能被轉換為整數。

char *p1 = nullptr; // 正確 int *p2 = nullptr; // 正確 bool b = nullptr; // 正確. if(b)判斷為false int a = nullptr; // 錯誤

注意nullptr和NULL以及0在作為條件判斷時值都為false,它們兩兩之間進行等于(==)判斷時值為true。

總結

以上是生活随笔為你收集整理的C++ NULL nullptr和0的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。