網站首頁 編程語言 正文
將左值引用用于一級指針時,有以下幾種用法:
//方式一:引用一級指針,常規用法 int a = 5; int * pa = &a; int * &rpa = pa; //方式二:引用指向常量的一級指針,以下幾種為等效表示 int a = 5; const int * pa = &a; const int * &rpac = pa; //方式一 int const * &rpac = pa; //方式二 //方式三:引用一級指針的常引用,引用自身為常量 int a = 5; int * pa = &a; int * const &crpa = pa; //方式四:引用指向常量的一級指針,且引用自身為常量,以下幾種為等效表示 int a = 5; int * pa = &a; const int * const &crpac = pa; //方式一 int const * const &crpac = pa; //方式二
在?Microsoft Visual Studio?中連續多個?const
?會被編譯器解釋成一個,即?const const const const int *&
?與?const int *&
?等效,除此之外,const int const *&
?在?Microsoft Visual Studio?中也與?const int *&
?等效,而?int *& const
?在?QT minGW?中將會報錯,在?Microsoft Visual Studio?中與?int *&
?等效。
各類型引用可修改屬性如下表所示:
引用類型 | 修改?*rp | 修改?rp |
---|---|---|
int * &rp |
可以 | 可以 |
const int * &rp |
不可以 | 可以 |
int * const &rp |
可以 | 不可以 |
const int * const &rp |
不可以 | 不可以 |
若將變量的地址賦予引用(例如?rp=&x
),各類型引用可接受的變量地址如下表所示:
引用類型 | int變量地址 | const int變量地址 |
---|---|---|
int * &rp |
不可以 | 不可以 |
const int * &rp |
不可以 | 不可以 |
int * const &rp |
聲明時可以(將創建臨時變量) | 不可以 |
const int * const &rp |
聲明時可以(將創建臨時變量) | 聲明時可以(將創建臨時變量) |
若將一級指針變量賦予引用(例如?rp=p
),各類型引用可接受的一級指針變量如下表所示。若賦值時等號右邊是函數返回的臨時指針變量(屬于右值),則只有當等號左邊為?int * const &
?以及?const int * const &
?類型時不會報錯,此時必會創建臨時變量(與?const
?左值引用性質一致)。
引用類型 | int *變量 | const int *變量 | int * const變量 | const int * const變量 |
---|---|---|---|---|
int * &rp |
可以 | 不可以 | 不可以 | 不可以 |
const int * &rp |
不可以 | 可以 | 不可以 | 不可以 |
int * const &rp |
聲明時可以 | 不可以 | 聲明時可以 | 不可以 |
const int * const &rp |
聲明時可以(將創建臨時變量) | 聲明時可以 | 聲明時可以(將創建臨時變量) | 聲明時可以 |
若將引用變量賦予引用(例如?rp=rp2
),各類型引用可接受的引用變量如下表所示。比較上下兩表可知,左值引用類型變量被初始化完畢后,若要將其賦值給另一引用變量,賦值時的表現與所引用類型的變量相一致。
引用類型 | int *&變量 | const int *&變量 | int * const&變量 | const int * const&變量 |
---|---|---|---|---|
int * &rp |
可以 | 不可以 | 不可以 | 不可以 |
const int * &rp |
不可以 | 可以 | 不可以 | 不可以 |
int * const &rp |
聲明時可以 | 不可以 | 聲明時可以 | 不可以 |
const int * const &rp |
聲明時可以(將創建臨時變量) | 聲明時可以 | 聲明時可以(將創建臨時變量) | 聲明時可以 |
補充:C++ (左值)引用和指針簡介
1. 引用
引用(reference):引用指向一個左值,并一直與指向的左值綁定(bind)在一起。用《C++ Primer》里面的話說,引用就是“給對象起了另外一個名字”
int ival = 1024; int &refVal = ival; // refVal引用ival
引用必須被初始化:引用被聲明后必須被立刻初始化,否則就會報錯
int ival = 1024; int &refVal = ival; // 順利引用 int &refVal2;?? ??? ?// 報錯,因為沒有初始化
引用無法更改指向的左值:引用一旦經過初始化綁定后,就無法更改綁定的對象
引用不是對象:引用只是一個對象的別名,自身不是對象。你對引用的賦值,取值實際上等于對其引用的對象的賦值,取值
int ival = 1024; int &refVal = ival; refVal = 2;?? ??? ??? ?// 等于對ival賦值 int ii = refVal;?? ?// 等于將ival的值賦給ii
一個對象多個引用:這是允許的,一個對象可以擁有多個”別名“
int ival = 1024; int &refVal = ival; int &refVal2 = ival;?? ?// refVal2作為ival的第二個引用
2. 指針
指針(Pointer):指針用于存儲一個對象的地址,我們稱為“指向”某個對象。通過指針,我們可以訪問到對象在內存空間中的地址以及對象本身存儲的值
int *p;?? ?// 定義一個指針
2.1. 獲取地址與訪問對象
利用指針獲取對象地址:由于指針本身是“存儲地址的對象”,我們不能直接讓指針存儲對象本身,這時候就需要用取地址符(&)來提取對象的地址
int ival = 42; int *p = &ival;?? ??? ?// 讓指針p指向ival的地址
利用指針訪問對象:直接訪問指針的話,得到的是地址。要訪問實際對象,就要用到解引用符(*)。解引用只適用于指向某個對象的有效指針
int ival = 42;
int *p = &ival;
int ival2;?? ??? ?// 新定義整數類型變量ival2
ival2 = *p;?? ??? ?// 將ival2賦值為p指向的值(也就是ival的值)
2.2. 指針的特殊狀態
空指針(Null Pointer):一個值為0,不指向任何對象的指針
// 以下三行代碼本質相同,都是初始化一個空指針 int *p1 = nullptr;?? ? int *p2 = 0; int *p3 = NULL;
未初始化的指針:未指向任何地址,并且也不是空指針的指針是忌使用的。這樣的指針由于指向的位置不確定,訪問時有可能會造成未定義行為(Undefined Behaviour)。所以在定義指針時,一定要進行初始化,即便現在不會立刻使用,也要初始化為空指針
2.3 void* 指針
void類型:void被稱之為“空類型”,它一般被用與沒有返回值的函數上。
void*指針:一個void類型的指針同樣能指向一塊內存地址,但因為類型是空,我們沒有辦法知曉指向的類型,以至于不知道該類型占用的內存大小,因此無法訪問指向的對象本身。
3. 引用和指針的復合使用
引用的引用:不合法。因為引用本身不是對象,所以無法使一個引用綁定另一個引用
引用的指針:不合法。因為引用本身不是對象,所以無法使一個指針指向一個引用
指針的引用:合法。指針本身是對象,引用可以綁定指針
int i = 42; int *p = &i; int *&r = p;?? ?// r引用指針p
指針的指針:合法。指針本身是對象,指針可以指向指針
int i = 42; int *p = &i;?? ?// p指向i int **p2 = &p;?? ?// p2指向p std::cout << **p2 << std::endl;?? ?// 兩次解引,輸出“42”
原文鏈接:https://www.cnblogs.com/young520/p/16714145.html
相關推薦
- 2023-01-28 C#實現自定義單選和復選按鈕樣式_C#教程
- 2022-09-17 docker安裝postgresql的圖文教程_docker
- 2022-12-07 C++?兩個vector對象拼接方式_C 語言
- 2022-08-01 React中的Hooks進階理解教程_React
- 2022-11-14 正則表達式手冊以備平時自己看
- 2022-09-16 Pandas篩選DataFrame含有空值的數據行的實現_python
- 2022-06-16 Golang?rabbitMQ生產者消費者實現示例_Golang
- 2023-10-16 修改el-textarea的字體以及placeholder字體和顏色
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支