C++指針和引用之區別(The Difference between C++Pointers and References)

面試題:C++指針和引用有什么區

C++指針和引用有什么區別?

在 C++ 中,指針和引用都是用來訪問其他變量的值的方式,但它們之間存在一些重要的區別。了解這些區別有助于更好地理解和使用這兩種工具。

01

指針

指針(Pointer)

定義:

指針是一個變量,它存儲了一個內存地址。

指針的類型是指向的數據的類型。

聲明:

指針通常用星號 * 來聲明,例如 int *p; 表示 p 是一個指向 int 類型的指針。

賦值:

指針可以通過賦值操作來指向不同的地址,例如 p = &a;,其中 &a 是變量 a 的地址。

指針可以指向 nullptr 或 NULL(在 C++11 之后推薦使用 nullptr)表示不指向任何對象。

解引用:

使用星號 * 來解引用指針并訪問它所指向的數據,例如 *p = 10;。

內存管理:

指針需要手動分配和釋放內存(使用 new 和 delete)。

指針可以指向任何類型的內存,包括未初始化的內存區域。

安全性

使用指針時需要特別小心,因為訪問無效或已釋放的內存可能導致程序崩潰或未定義行為。

代碼示例:

#include <iostream>
int main() {    int a = 10;    int *p = &a;  // p 指向 a    *p = 20;      // 修改 a 的值    std::cout << "a: " << a << std::endl;  // 輸出 20
    p = nullptr;  // p 不再指向任何東西    *p = 30;      // 錯誤!p 為 nullptr    return 0;}

02

引用

引用(Reference)
定義

引用是一個別名,它是一個已經存在的變量的另一個名字。

引用不是真正的變量,它不占用額外的存儲空間。

聲明

引用通常用 & 符號聲明,例如 int &r = a; 表示 r 是變量 a 的引用。

賦值

引用一旦初始化后就不能更改,也就是說,不能重新綁定到另一個對象。一旦綁定后,引用始終指向同一個對象。

初始化時必須立即綁定到一個對象,不能是 nullptr。

解引用:

引用本身就是一個左值(可以出現在賦值的左邊),因此不需要解引用即可訪問其綁定的對象,例如 r = 10;。

內存管理:

引用本身不涉及內存分配,它只是現有對象的一個別名。

引用通常用于傳遞大對象或作為函數返回值,以避免不必要的拷貝。

安全性:

使用引用相對安全,因為引用總是有效,不會指向不存在的對象。

代碼示例:

#include <iostream>
int main() {    int a = 10;    int &r = a;  // r 是 a 的引用    r = 20;      // 修改 a 的值    std::cout << "a: " << a << std::endl;  // 輸出 20
    // 下面的語句是非法的,因為引用不能重新綁定到另一個對象    // int b = 30;    // r = b;  // 錯誤!r 不能重新綁定
    return 0;}03

引用不占用內存空間

看下面示例代碼:

#include?<iostream>
int main() {    int a = 9;    int& b = a;  // b 是 a 的引用    int* p = &a;
    std::cout << "a 的地址: " << &a << std::endl;    std::cout << "b 的地址: " << &b << std::endl;    std::cout << "p 的地址:" << &p << std::endl;
    return 0;}

運行輸出:

可以看到引用b的地址和變量a的地址是一樣的,b就是a的一個別名,它不涉及到額外的內存分配。但是指針p是一個變量,指針本身也會占用內存。

在 C++ 中,引用的內存分配如下:

變量 a:

分配一塊內存空間存儲 a 的值。

引用 b:

不需要分配新的內存空間,它直接綁定到 a 上。

因此,無論在代碼中創建多少個引用,它們都不會占用額外的內存空間,只會占用現有變量的內存。

04
總結

指針:

指針是一個變量,存儲地址。

指針本身占用存儲空間。

指針可以初始化為空,可以重新指向其他地址。

引用:

引用不是一個變量,而是現有變量的別名。

引用本身不占用存儲空間。

引用不能初始化為空,一旦初始化后不能重新綁定到另一個對象

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

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

相關文章

LWIP學習筆記

TCP/ip協議結構分層 傳輸層簡記 TCP&#xff1a;可靠性強&#xff0c;有重傳機制 UDP&#xff1a;單傳機制&#xff0c;不可靠 UDP在ip層分片 TCP在傳輸層分包 應用層傳輸層網絡層&#xff0c;構成LWIP內核程序&#xff1a; 鏈路層&#xff1b;由mac內核STM芯片的片上外設…

【經驗記錄貼】活用shell,提高工作效率

背景 最近在做測試的時候&#xff0c;需要手動kill服務的進程&#xff0c;然后通過命令重啟服務&#xff0c;再進行測試。每次重啟都會涉及到下面三個命令的執行&#xff1a; 1&#xff09;檢索進程ID $ ps -eLf | grep programname root 1123 112 1234 0 0 0 0:00…

MacOS 系統下 Git 的詳細安裝步驟與基礎設置指南

MacOS 系統下 Git 的詳細安裝步驟與基礎設置指南—目錄 一、安裝 Git方法 1&#xff1a;通過 Homebrew 安裝&#xff08;推薦&#xff09;方法 2&#xff1a;通過 Xcode Command Line Tools 安裝方法 3&#xff1a;手動下載安裝包 二、基礎配置1. 設置全局用戶名和郵箱2. 配置 …

一文讀懂 AI

2022年11月30日&#xff0c;OpenAI發布了ChatGPT&#xff0c;2023年3月15日&#xff0c;GPT-4引發全球轟動&#xff0c;讓世界上很多人認識了ai這個詞。如今已過去快兩年半&#xff0c;AI產品層出不窮&#xff0c;如GPT-4、DeepSeek、Cursor、自動駕駛等&#xff0c;但很多人仍…

【教程】檢查RDMA網卡狀態和測試帶寬 | 附測試腳本

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 目錄 檢查硬件和驅動狀態 測試RDMA通信 報錯修復 對于交換機的配置&#xff0c;可以看這篇&#xff1a; 【教程】詳解配置多臺主機通過交換機實現互…

計算機網絡 - TCP協議

通過一些問題來討論 TCP 協議 什么是 TCP &#xff1f;舉幾個應用了 TCP 協議的例子TCP協議如何保證可靠性&#xff1f;tcp如何保證不會接受重復的報文&#xff1f;Tcp粘包拆包問題了解嗎&#xff1f;介紹一下&#xff0c;如何解決&#xff1f;TCP擁塞控制與流量控制區別&…

Fiddler 進行斷點測試:調試網絡請求

目錄 一、什么是斷點測試&#xff1f; 二、Fiddler 的斷點功能 三、如何在 Fiddler 中設置斷點&#xff1f; 步驟 1&#xff1a;啟動 Fiddler 步驟 2&#xff1a;啟用斷點 步驟 3&#xff1a;捕獲請求 步驟 4&#xff1a;修改請求或響應 四、案例&#xff1a;模擬登錄失…

OpenCv高階(三)——圖像的直方圖、圖像直方圖的均衡化

目錄 一、直方圖 1、計算并顯示直方圖 2、使用matplotlib方法繪制直方圖&#xff08;不劃分小的子區間&#xff09; 3、使用opencv的方法繪制直方圖 &#xff08;劃分16個小的子亮度區間&#xff09; 4、繪制彩色圖像的直方圖&#xff0c;將各個通道的直方圖值都畫出來 二、…

Flutter 與原生通信

Flutter 與原生之間的通信主要基于通道機制&#xff0c;包括 MethodChannel、EventChannel 和 BasicMessageChannel。 MethodChannel&#xff1a;用于 Flutter 與原生之間的方法調用&#xff0c;實現雙向通信&#xff0c;適合一次性的方法調用并獲取返回值&#xff0c;如 Flut…

前端面試-Vue篇

核心概念 Vue 3的響應式原理與Vue 2有何本質區別&#xff1f;Vue中虛擬DOM的diff算法優化策略有哪些&#xff1f;Vue組件間通信方式有哪些&#xff1f;適用場景分別是什么&#xff1f;Vue的生命周期鉤子在Composition API中如何替代&#xff1f;Vue的模板編譯過程是怎樣的&…

光刻機研發與市場現狀分析報告

1. 引言 光刻機&#xff08;Lithography Machine&#xff09;是半導體制造的核心設備&#xff0c;其技術水平和市場供應能力直接影響全球芯片產業的發展。隨著人工智能&#xff08;AI&#xff09;、5G、高性能計算&#xff08;HPC&#xff09;和自動駕駛等技術的興起&#xff0…

Missashe考研日記-day21

Missashe考研日記-day21 1 專業課408 學習時間&#xff1a;4h學習內容&#xff1a; 今天先把昨天學的內容的課后習題做了&#xff0c;整整75道啊&#xff0c;然后學了OS第二章關于CPU調度部分的內容&#xff0c;這第二章太重要了&#xff0c;以至于每一小節的內容都比較多&am…

【玩轉全棧】—— Django+vue3+訊飛星火API 實現前端頁面實時AI答復

技術棧&#xff1a;vue3 element-plus axios pinia router Django5 websocket 訊飛星火API 本文將實現一個 AI 聊天對話功能&#xff0c;將前端用戶輸入問題以及之前對話發送給后端&#xff0c;通過 api 訪問大模型&#xff0c;返回前端實時對話數據。 調用 訊飛星火API…

廣東廣州一家IPO資產重組疑點重重,信息披露真實性存疑

作者&#xff1a;Eric 來源&#xff1a;IPO魔女 4月18日&#xff0c;廣州瑞立科密汽車電子股份有限公司&#xff08;簡稱“瑞立科密”&#xff09;將接受深交所主板IPO上會審核。公司保薦機構為中信證券&#xff0c;擬募集資金為15.2162億元。 瑞立科密過往資產重組疑點重重&a…

銀河麒麟(Kylin) - V10 SP1桌面操作系統ARM64編譯QT-5.15.12版本

銀河麒麟(Kylin) - V10 SP1桌面操作系統ARM64編譯QT-5.15.12版本 原因 測試Kylin-Desktop-V10-SP1-General-Release-2303-arm64系統下&#xff0c;編譯QT-5.15.12版本已做測試。 測試環境 測試板配置 型號&#xff1a;LM-D2000-NONE-1w-V01-pc_A2150 CPU&#xff1a;飛騰D20…

查看前端項目依賴樹型結構關系圖的詳細方法,涵蓋 命令行工具 和 可視化工

以下是查看前端項目依賴樹型結構關系圖的詳細方法&#xff0c;涵蓋 命令行工具 和 可視化工具&#xff1a; 一、命令行工具生成依賴樹 1. npm # 查看項目依賴樹&#xff08;文本形式&#xff09; npm ls# 查看指定包的依賴樹 npm ls <package-name># 生成JSON格式的依…

Ollama高并發測試

本文主要來測試一下ollama的高并發能力。 具體配置如下&#xff1a; 一、Ollama默認參數執行 我們打開4個窗口&#xff0c;然后分別讓DeepSeek “給我講一個笑話” &#xff0c;看下不同窗口的答題順序。 通過答題順序可以看到&#xff0c;在不進行參數設置時&#xff0c;模…

資源管理與HPA:讓Kubernetes應用自動伸縮

引言&#xff1a;從“手動擋”到“自動駕駛” 想象我們駕駛一輛汽車&#xff0c;手動調節油門和換擋不僅費力&#xff0c;還難以應對突發狀況。我們的應用服務也一樣&#xff0c;在面對突然的流量增長&#xff0c;內存使用暴漲該如何應對。HPA&#xff08;Horizontal Pod Auto…

Windows 下 MongoDB ZIP 版本安裝指南

在開發和生產環境中&#xff0c;MongoDB 是一種非常流行的 NoSQL 數據庫&#xff0c;以其靈活性和高性能而受到開發者的青睞。對于 Windows 用戶來說&#xff0c;MongoDB 提供了多種安裝方式&#xff0c;其中 ZIP 版本因其靈活性和輕量級的特點&#xff0c;成為很多開發者的首選…

【Linux網絡與網絡編程】11.數據鏈路層mac幀協議ARP協議

前面在介紹網絡層時我們提出來過一個問題&#xff1a;主機是怎么把數據交給路由器的&#xff1f;那里我們說這是由數據鏈路層來做的。 網絡上的報文在物理結構上是以mac幀的形式流動的&#xff0c;但在邏輯上是以IP流動的&#xff0c;IP的流動是需要mac幀支持的。 數據鏈路層解…