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是一個引用,但是卻是一個指針的引用

Tags: