C++中 指針的指針是什麼?指針的引用又是什麼?你可能需要看看這篇文章
- 2022 年 4 月 20 日
- 筆記
關於變數的定義
我們都知道變數的定義包括一個基本數據類型(base type)和一組聲明符,在同一條定義語句中,輸入基本數據類型不同,但是聲明符的形式卻可以不同。
//如:i是一個int的整數,a是一個int型的指針,b是一個int型的引用
int i = 0 , *a = i , &b = i;
我們不需要太在意基本數據類型和類型修飾符的關係,後者只不過是前者聲明符的一部分罷了。
定義多個變數
有很多人認為類型修飾符(如&和*)在定義中會作用於全部的函數,就是一次定義,一句中所有的變數使用(不得不說這樣真方便,但是編譯器不允許我們這樣做)
//如這樣 , 很正常的一次聲明
int *p;
但是像下面這樣一次聲明兩個卻是錯誤的
int * p1 , p2
應該是這樣才對
int *p1 , *p2;
指向指針的指針
按照邏輯來說,C++中並沒有限制聲明符中修飾符的個數,我們只需要按照其邏輯去加以解讀即可。像指針,指針是記憶體中的對象,當然也可以像其他對象一樣對它將它的地址再放到另一個指針當中。
int *p; //指針
int **p; //指向指針的指針
int ***p; //指向指針的指針的指針
它們的關係圖如下:

一般int指針解引用時,會得到一個int的數。解引用指針的指針時也是一樣,會得到一個指針。
指向指針的引用
引用(可以理解為一個變數的副本)本身不是一個對象,所以不存在指向引用的指針;但是指針是一個對象,所以它存在指向指針的引用。
int i = 10;
int *p; //p是一個int型的指針
int *&b = p; //b是一個指針的引用,它是對p的引用
b = &i; //b引用了一個指針,因此給b賦值&i就是令p指向i
*b = 0; //解引用b得到i ,也就是p指向的對象,將i的值改為0
1、p是一個int型的指針
2、b是一個指針的引用,它是對p的一個引用
3、b引用了一個指針,因此給b賦值&i就是令p指向i
4、解引用b得到i ,也就是p指向的對象,將i的值改為0
如何解讀r呢?
直觀的方法就是從左向右閱讀,因為離變數名最近的修飾符對變數的類型有直接的影響。所以b是一個引用,但是卻是一個指針的引用

