C++的指針和引用:

目錄

引用:

注意:

左值引用和右值引用:

左值引用:

右值引用:

指針:

指針與引用的區別:


引用:

在C++中,?引用?是一種為已存在變量創建別名的機制,它允許通過不同的名稱訪問同一塊內存空間的數據。

上述圖對應的引用代碼:

int a=1;
int &b=a;

先初始化定義一個變量a,編譯器會為變量a開辟一個存儲空間并存儲值。然后又對變量a進行了一個引用將變量b綁到變量a的內存地址,不會額外占用內存空間,也就是變量b是變量a的別名,變量a和變量b的地址都是一樣的,對同一塊內存空間進行管理。變量b也能訪問變量a中的值并且也能進行修改。

訪問變量a的存儲空間中的值需要先知道變量a的地址。我們可以把變量a的存儲空間看成一個房間,而變量a的地址就是這個房間的門牌號,變量b對變量a進行一個引用,就相當于把變量b也當成變量a的房間號,然后通過變量b也能夠找到該房間。變量a和變量b都這間房間的門牌號,無論誰對房間里面的值進行修改,變量a和變量b的值都會發生變化。

注意:

引用前必須進行初始化:引用在創建時必須被初始化,它必須指向某個已存在的對象。

一旦綁定之后,不可改變:引用一旦被初始化后,它將一直保持與其初始對象的綁定,不能改變為另一個對象的引用。

沒有空引用:引用必須指向某個對象,不能存在空引用。

左值引用和右值引用:

左值引用:

表示持久化對象,具有明確內存地址(可&取址),可以被多次賦值,可出現在賦值符號左側或右側。可以被多次賦值。

右值引用:

表示臨時對象或字面量,無持久地址(不可&取址),僅能出現在賦值符號右側。主要用于是在函數參數和返回值中,以實現更高效的資源管理和更靈活的代碼編寫方式。

指針:

指針是存儲內存地址的變量,通過地址間接訪問數據。其值為另一個變量的內存位置直接地址,而不是數據本身。引用本身不是一個對象,不能定義只想引用的指針。

int a = 10;
int *b = &a;

初始化定義變量a,編譯器會為其開辟一個空間并存儲值。"int *b = &a"將變量a的地址進行賦值給變量b,因為變量b也是一個變量,所以編譯器也會其開辟一個存儲空間,將變量a的地址存儲到變量b的內存空間中。

指針的地址也可以用另一個指針進行存儲。

int a = 10;
int *b= &a;
int **c = &b;

使用一個指針c將指針b的地址存儲到其存儲空間中。如果想要通過其存儲的地址進行訪問到變量a具體的值,那么就可以進行解引用操作來進行訪問。

std::cout<<"a的值"<<a<<std::endl;
std::cout<<"通過指針b訪問"<<*b<<std::endl;
std::cout<<"通過指針c訪問"<<**c<<std::endl;

指針c通過一次解引用"*c"得到的就是指針b也就是變量a的地址,因為指針c中存儲的是變量b的地址,c就代表變量b的地址,那么對c進行一次解引用就會得到指針b中存儲的內容。再對指針b進行一個解引用"*b"那么就相當于對指針c進行了兩次解引用操作"**c"就是對指針b中存儲的內容(變量a的地址)進行一次解引用,那么就會得到變量a中的值。

指針的一個運算:

數組的數組名就是一個指向數組的首元素的指針,如果定義一個指針存儲數組首元素的地址進行一個自增的話,因為數組是一塊連續的內存空間,根據數組存儲的數據類型占用的字節大小,來進行一個首元素地址,也就是起始地址來進行偏移,得到下一個元素的內存地址。

注意:數組名是一個常量指針,不可以修改指向,對數組名進行修改是非法的。可以通過數組名+i,來進行一個數組中元素的偏移地址。

int arr[10] = {0};
int *p = arr;
std::cout<<p<<std::endl;
p++;
std::cout<<p<<std::endl;

可以用上述方式進行一個驗證。

指針與引用的區別:

指針可以不用進行初始化,引用必須進行初始化。

指針是一個變量,編譯器會為其分配存儲空間,而引用不是一個對象,不會為其分配存儲空間。

指針可以進行多級引用,而引用不可以多級引用。

指針在其生命周期內可以修改指向的對象,而引用一旦綁定對象之后,則不可以進行修改。

對指針進行計算大小:sizeof(指針)的大小與指向的數據類型無關,在32位系統中為4字節,在64為系統中占8字節,而引用不同,因為引用本身不占獨立的存儲空間,sizeof(引用)的大小是其綁定對象的大小。

指針可以為空,而引用不能為空,必須綁定對象。

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

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

相關文章

圖像處理中的偽影

目錄 一、塊效應偽影 / 塊狀偽影 二、 去除塊狀偽影 三、振鈴偽影 一、塊效應偽影 / 塊狀偽影 塊狀偽影(Blocking Artefacts)是對經過變換編碼的圖像進行重建時&#xff0c;圖像中可能會出現壓縮過程產生的可見偽影。基于塊的變換編碼中&#xff0c;一種常見偽影是 “塊效應…

Java:對象的淺拷貝與深拷貝

目錄 一、概念 二、實現方式 2.1 淺拷貝&#xff08;不推薦&#xff09; 2.2 深拷貝 2.2.1 方法一&#xff1a;重寫 clone() 方法并遞歸克隆&#xff08;常用&#xff09; 2.2.2 方法二&#xff1a;通過序列化實現&#xff08;更強大&#xff0c;但更重&#xff09; 2.2…

佰鈞成 社招 一面

1. “評估需求、排期”的工作流程&#xff1f; “我的工作流程一般是這樣的&#xff1a; 需求評審&#xff1a; 首先會和產品、后端同學一起過需求&#xff0c;確保我完全理解了業務背景和要實現的價值&#xff0c;而不僅僅是功能點。技術方案設計&#xff1a; 之后&#xff0c…

最短路徑問題(圖論)

1 Floyd 作用&#xff1a; 求圖中所有頂點之間的最短路徑&#xff0c;包括有向圖或者無向圖&#xff0c;權重正負皆可&#xff0c;用來一次性求所有點之間的最短路徑。 思路是 通過逐步擴大中間層&#xff0c;使得最短路徑不斷被更新&#xff0c;直到中間層擴大到n位置&#…

2025年8月新算法—云漂移優化算法(Cloud Drift Optimization Algorithm, CDO)

1、簡介 這項研究介紹了云漂移優化&#xff08;數位長&#xff09;算法&#xff0c;這是一種創新的自然啟發的元啟發式方法來解決復雜的優化問題。CDO模仿受大氣力影響的云粒子的動態行為&#xff0c;在探索和利用之間取得了微妙的平衡。它具有自適應權重調整機制&#xff0c;可…

VS Code進行.NET開發時使用斷點和熱重載

VS Code 調試熱重載 1. VS Code 設置 安裝擴展&#xff1a;C#、C# Dev Kit設置中搜索hot reload&#xff0c;選擇C#開發工具包&#xff0c;把下圖的幾項全部打勾2. 啟動項目&#xff08;僅用左側“運行和調試”&#xff09; 打開解決方案&#xff0c;選你的啟動項目的“.NET La…

mysqlbinlog解析命令

解析 MySQL Binlog 詳細信息的命令以下是解析 MySQL Binlog 詳細信息的常用命令&#xff1a;1. 基本 binlog 解析命令# 查看 binlog 文件內容&#xff08;基本格式&#xff09; mysqlbinlog /var/lib/mysql/mysql-bin.000001# 查看特定時間段的 binlog mysqlbinlog --start-dat…

算法訓練營day60 圖論⑩ Bellman_ford 隊列優化算法、判斷負權回路、單源有限最短路(修改后版本)

增加對最短路徑的優化算法、負權回路、單源有限最短的講解 Bellman_ford 隊列優化算法 -------------------------------------------------------------------------------- 8.24更新&#xff1a;該算法是針對帶負值的最短路徑的優化算法&#xff0c;核心通過隊列來實現&…

Python 學習(十六) 下一代 Python 包管理工具:UV

目錄1. UV 介紹1.1 什么是UV&#xff1f;1.2 UV的核心優勢1.3 UV和其他工具對比1&#xff09;UV vs. pipvirtualenv2&#xff09;UV vs. Conda3&#xff09;UV vs. Poetry4&#xff09;功能對比表2. UV的安裝與常用命令2.1 安裝UV1&#xff09;使用官方安裝腳本&#xff08;推薦…

Redis學習筆記 ----- 緩存

一、什么是緩存 緩存&#xff08;Cache&#xff09;是數據交換的緩沖區&#xff0c;是存儲數據的臨時地方&#xff0c;一般讀寫性能較高。 &#xff08;一&#xff09;緩存的作用 降低后端負載&#xff1a;減少對數據庫等后端存儲的直接訪問壓力。提高讀寫效率&#xff0c;降低…

React響應式鏈路

文章目錄響應式鏈路的核心環節1.狀態定義與初始化2.狀態更新觸發&#xff08;狀態變更&#xff09;3.調度更新&#xff08;Scheduler&#xff09;4.重新渲染&#xff08;Render 階段&#xff09;5.協調&#xff08;Reconciliation&#xff09;與 Fiber 架構6.提交更新&#xff…

軟件設計師——計算機網絡學習筆記

一、計算機網絡 網絡基礎 1. 計算機網絡的分類2. 網絡拓撲結構 總線型(利用率低、干擾大、價格低) 星型(交換機形成的局域網、中央單元負荷大) 環型(流動方向固定、效率低擴充難) 樹型(總線型的擴充、分級結構) 分布式(任意節點連接、管理難成本高)一般來說&#xff0c;辦公室局…

1200 SCL學習筆記

一. IF. 如果。下面是一個起保停IF #I_start AND NOT #I_stop THEN //如果I_start接通 和 I_stop沒有接通#Q_run : 1; //輸出Q_run 接通 ELSIF #I_stop THEN //如果I_stop接通#Q_run : 0; //。。。。。。 END_IF;二. CASECASE…

單例模式與線程池

1. 單例模式單例模式是一種常用的設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來獲取這個實例。這種模式在需要控制資源訪問、管理共享狀態或協調系統行為時非常有用。單例模式的核心特點&#xff1a;私有構造函數&#xff1a;防止外部通過n…

Chrome和Edge如何開啟暗黑模式

Edge和Chrome瀏覽器都提供了實驗性功能&#xff0c;可以通過修改實驗性設置來開啟暗黑模式。 在瀏覽器地址欄中輸入edge://flags/&#xff08;Edge&#xff09;或chrome://flags/&#xff08;Chrome&#xff09;。在搜索框中輸入“dark”&#xff0c;找到與暗黑模式相關的選項。…

【科研繪圖系列】浮游植物的溶解性有機碳與初級生產力的關系

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 數據準備 數據處理 溶解性有機碳(DOC)與初級生產力(NPP)的關系 溶解性有機碳(DOC)與光照強度(PAR)的關系 數據可視化 加載R包 數據下載 導入數據 畫圖1 畫圖2 總結 系統信…

IDEA相關的設置和技巧

IDEA相關的設置和技巧 我的博客對應文章地址 1.布局設置 IDEA的布局自定義程度很高&#xff0c;頂部工具欄&#xff0c;側邊欄都可以隨意定制&#xff0c;設置好的布局方案可以保存&#xff0c;在新項目中快速使用 1.1 工具欄設置 [!tip] 舉個例子&#xff1a;比如我要在頂部…

AWS Lambda 完全指南:解鎖無服務器架構的強大力量

在云計算的發展浪潮中,無服務器(Serverless) 架構已然成為構建現代應用的新范式。而在這場變革的中心,AWS Lambda 作為開創性的 Function-as-a-Service (FaaS) 服務,徹底改變了我們部署和運行代碼的方式。 本文將帶您深入探索 AWS Lambda,從核心概念、工作原理到高級實踐…

人工智能時代下普遍基本收入(UBI)試驗的實踐與探索——以美國硅谷試點為例

一、硅谷UBI試驗的最新進展&#xff08;2025年&#xff09;1. 試驗規模與資金來源圣克拉拉縣試點&#xff1a;硅谷所在地圣克拉拉縣針對脫離寄養家庭的年輕人開展UBI試驗&#xff0c;每月發放1000美元補貼&#xff0c;持續1-2年&#xff0c;覆蓋約60名參與者&#xff0c;成本約…

云計算之云主機Linux是什么?有何配置?如何選?

一、云環境如何選擇Linux發行版 1.1、Linux在各個領域的發展 Linux在各個領域的發展序號Linux發展領域說明1Linux在服務器領域的發展目前Linux在服務器領域已經占據95%的市場份額&#xff0c;同時Linux在服務器市場的迅速崛起&#xff0c;已經引起全球IT產業的高度關注&#xf…