【C++11】nullptr關鍵字使用詳解

系列文章目錄

C++11新特性使用詳解-持續更新
https://blog.csdn.net/xiaofeizai1116/category_12498334.html


文章目錄

    • 系列文章目錄
    • 一、簡介
    • 二、引入nullptr原因
      • 1. 消除歧義
      • 2. 兼容性問題
      • 3. 類型安全
    • 三、使用場景
      • 1. 初始化指針變量
      • 2. 判斷指針是否為空
      • 3. 釋放內存后置為空
    • 四、總結


一、簡介

C++11引入了nullptr關鍵字,它是一種空指針類型,用于表示空指針。

二、引入nullptr原因

C++11之前空指針一般用`NULL宏或者0值表示,為什么還有引入nullptr呢?

1. 消除歧義

NULL宏在不同的編譯器環境中可能代表不同的值,容易造成對空指針的理解混亂;另外把0賦給指針,也容易給人造成把整數常量賦給指針的誤解。使用nullptr從語言層面解決了上述問題,提高了代碼的可讀性。

Note
NULL本質上是0,在內存中表示不存在或沒有指向任何對象的指針。如果一個指針被初始化為NULL,意味著它目前不指向任何對象或數據。

2. 兼容性問題

不同平臺對NULL的定義不同,可能導致移植問題。相比之下,因為nullptr是語言層面的關鍵字,不會存在平臺依賴性問題,從而提高代碼的可移植性。

3. 類型安全

nullptr是一個類型安全的空指針,它明確地表示一個空指針,不能轉換成任何除void*以外的其他類型。避免了使用NULL時可能出現的類型轉換問題。

Note
NULL是一個宏,不是關鍵字,所以它不會被編譯器檢查類型。如果將其用于需要指針類型的地方,編譯器會將其視為0,而不是一個指針類型。

/*
下面這段代碼會運行時會崩潰,原因如下
NULL是一個宏,通常被定義為0或((void*)0),表示一個空指針。當我們將一個指針變量賦值為NULL時,它表示這個指針變量不指向任何有效的內存地址。
在解引用一個指針時,我們需要將指針所指向的內存地址中的值讀取出來。在代碼int x = *p1中,表示讀取p1所指向的內存地址中的值。由于p1是一個int類型的指針,編譯器期望p1指向一個整數類型的內存地址。但是,由于NULL是一個void*類型的值,它不是一個整數類型的值,當試圖將一個void類型的值賦給一個int類型的變量時,因為類型不匹配,編譯器會報錯。
*/
int* p1 = NULL;
int x = *p1;
/*
相比之下,使用nullptr可以避免類型不匹配的問題。
nullptr是一個類型安全的空指針,它明確地表示一個空指針。
編譯器會檢查使用nullptr的上下文,確保它被正確地用于指針類型。在這段代碼中,p2被初始化為nullptr,表示它是一個空指針。
由于p2被聲明為int*類型,編譯器期望p2指向一個整數。然而,由于p2是空的,不能解引用它來獲取一個整數值。編譯器會報錯,避免了類型轉換問題。
*/
int* p2 = nullptr;
int x = *p2; // 編譯器會報錯,因為p是一個空指針

三、使用場景

1. 初始化指針變量

用nullptr聲明一個空指針變量

int* p = nullptr;  // 初始化一個整型指針變量p,值為空指針

在需要指針類型的地方,編譯器會根據上下文自動將nullptr轉換為正確的指針類型

/*
在這個例子中,我們調用func函數時傳遞了一個空指針作為參數。編譯器會自動將nullptr轉換為整數類型的指針,并傳遞給func函數。
func函數在接收到空指針后,就可以避免對無效的內存地址進行操作,從而避免了潛在的錯誤。
*/
void func(int* p) {  // ...  
}  int main() {  func(nullptr); // 使用nullptr表示不傳遞任何有效的指針  return 0;  
}

2. 判斷指針是否為空

int* p = getPointFunc();  
if (p != nullptr) {  // 如果p不為空指針,則執行這里的代碼  
}

3. 釋放內存后置為空

int* p = new int;  // 動態分配內存  
// 使用p指向的內存  
delete p;  // 釋放內存  
p = nullptr;  // 明確地將p設置為空指針

四、總結

總的來說,nullptr是以一種更安全、更清晰的方式來處理空指針。只要正確理解和合理使用,它就能夠幫助我們編寫出質量更高、更容易維護的代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167719.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167719.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167719.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【nlp】3.5 Transformer論文復現:3.解碼器部分(解碼器層)和4.輸出部分(線性層、softmax層)

Transformer論文復現:3.解碼器部分(解碼器層)和4.輸出部分(線性層、softmax層) 3.1 解碼器介紹3.2 解碼器層3.2.1 解碼器層的作用3.2.2 解碼器層的代碼實現3.2.3 解碼器層總結3.3 解碼器3.3.1 解碼器的作用3.3.2 解碼器的代碼實現3.3.3 解碼器總結4.1 輸出部分介紹4.2 線性…

Python---函數定義時缺省參數(參數默認值)

缺省參數也叫默認參數,用于定義函數,為參數提供默認值,調用函數時可不傳該默認參數的值(注意:所有位置參數必須出現在默認參數前,包括函數定義和調用)。 def user_info(name, age, gender男):pr…

Elaticsearch學習

Elaticsearch 索引 1、索引創建 PUT /index_v1 {"settings": {"number_of_shards": 3,"number_of_replicas": 1},"mappings": {"properties": {"aaa": {"type": "keyword","store&qu…

匯編-CALL和RET指令

CALL指令調用一個過程, 使處理器從新的內存位置開始執行。過程使用RET(從過程返回) 指令將處理器轉回到該過程被調用的程序點上。 CALL指令的動作: 1.將CALL指令的下一條指令地址壓棧(作為子過程返回的地址) 2.將被調過程的地址復制到指令指針寄存器E…

搜維爾科技:Faceware面部捕捉最佳實踐!

視頻源和分辨率: 我們的軟件針對 RGB 彩色素材進行了優化,不支持使用紅外攝像機。 我們建議視頻分辨率為 720p 和 1080p。低于 720p 的分辨率可能會對跟蹤質量產生負面影響,而高于 1080p 的分辨率會導致存儲要求和傳輸時間增加,而…

python——第十三天

uuid 是通用唯一識別碼(Universally Unique identifier)的縮寫 UUID是一個128比特的數值 uuid模塊: 獲取一個128位(比特)的永不重復的數字,當然我們使用的時候會轉換為32個的字符串 impor uuud uui…

【Java 進階篇】Jedis:讓Java與Redis輕松對話的利器

在現代軟件開發中,緩存系統是提高系統性能的常見手段之一,而Redis作為一個高性能的緩存數據庫,被廣泛應用于各類系統。如果你是Java開發者,那么使用Jedis庫可以讓你輕松地與Redis進行交互。本文將帶你深入了解Jedis的快速入門&…

c語言-冒泡排序

冒泡排序原理: 冒泡排序是一種簡單直觀的排序算法,它重復地遍歷待排序的元素序列,比較相鄰的兩個元素,如果它們的順序不符合要求(例如升序要求前面的元素小于后面的元素),則交換它們的位置。遍歷…

國家開放大學平時作業 練習題

試卷代號:1377 理工英語3 參考試題 一、交際用語(共計10分,每小題2分) 1-5題:選擇正確的語句完成下列對話,并將答案序號寫在答題紙上。 1.-1 won the first prize in todays speech contest. - …

R語言——圖解taxize,強烈推薦收藏關注,持續更新中

圖解taxize 1. taxize分解思路1.1 圖解說明 2. 針對不同數據庫的函數組2.1 APGⅢ2.2 BOLD(barcode of life data system) 1. taxize分解思路 taxize可以幫助人們從許多數據庫中獲取信息。 由于要處理的數據庫很多,導致taxize包含的功能函數…

基本鎖介紹

鎖 1、分類 樂觀鎖:在select的時候不會加鎖,是基于程序實現的,所以不會存在死鎖的情況。適用于讀多寫少的場景(寫的并發量相對不高),可以提高系統的吞吐量。因為如果寫多的話,樂觀鎖會有很大機率更新失敗…

可持續創新 精選路線

在加速企業數字化轉型、 實現智能制造的升級之路上! 使用好的工具固然重要, 而有好工具,也要會用工具。生信科技不僅為企業提供強大的產品支持, 更有全方位的定制化服務, 提升工程師的工具應用能力, 讓企業…

C++ Qt QFile用法介紹與代碼演示

作者:令狐掌門 技術交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目錄 打開和關閉文件讀取文件寫入文件示例代碼自定義格式文件解析在Qt 中 QFile 的類用于讀寫本地文件系統中的文件。它繼承自 QIODevice,所以它包含了許多用于數據輸入和輸出的功…

c++ 課程筆記

105課: cpp文件分為 .h .cpp .cpp 文件 110課:124課 深拷貝 淺拷貝 自建拷貝構造解決淺拷貝釋放new后堆區析構函數的問題 (淺拷貝 拷貝內存地址, 釋放堆區時 導致源數據 釋放時,該地址無數據?而報錯) 淺拷貝: 拷貝了對方的值和 堆區內存地址(刪除 影響原數據堆區) 深拷貝…

第二類曲線積分@對坐標的曲線積分

文章目錄 abstract對坐標的曲線積分變力沿曲線所做的功平均功(恒力做功)變力做工弧段微分第二類曲線積分的定義函數在曲線弧上連續推廣:空間曲線弧的第二類曲線積分常用形式和簡寫利用第二類曲線積分表示變力做功性質 計算方法證明對坐標 x x x對坐標 y y y相加積分限和曲線弧起…

文件批量重命名技巧:圖片文件名太長怎么辦?告別手動改名方法

在日常生活中,常常會遇到文件名過長導致的問題。尤其是在處理大量圖片文件時,過長的文件名可能會使得文件管理變得混亂不堪。現在來看下云炫文件管理器如何批量重命名,讓圖片文件名變得更簡潔,提高工作效率。 操作1、在云炫文件…

python運算符重載之字符串顯示和右側加法

1 python運算符重載之字符串顯示和右側加法 1.1 重載字符串顯示 1.1.1 str和repr python調用prin()t時,自動調用__str__和__repr__, python調用str()時,自動調用__str__和__repr__, python調用repr()時,自動調用_…

深入理解C語言指針基礎概念:定義、內存地址與聲明初始化

導言: 在C語言中,指針是一項強大而重要的概念,直接涉及內存的底層操作。理解指針的基礎概念對于熟練運用C語言以及理解底層系統工作原理至關重要。本文將深入研究指針的定義、內存地址的概念以及指針的聲明和初始化,幫助讀者建立對…

C++之unordered_map/set的使用

前面我們已經學習了STL中底層為紅黑樹結構的一系列關聯式容器——set/multiset 和 map/multimap(C98). unordered系列關聯式容器 在C98中, STL提供了底層為紅黑樹結構的一系列關聯式容器, 在查詢時效率可達到log2N,即最差情況下需要比較紅黑樹的高度次, 當樹中的節點非常多時,…

3 動態規劃解解碼問題

來源:LeetCode第91題 難度:中等 描述:一條包含字母A-Z的消息通過以下映射進行了編碼: A->1,B->2,z->26,要接嗎已編碼的消息,所有數字必須基于上述映射的方法,反向映射回字母(可能由多種方法),例…