多級指標就是指標的指標的指標...,實際上也沒那麼複雜,非常簡單。本節來看看如何理解多級指標。
假如定義了一個二級指標:
int **q;
q 的前面有兩個“*”,這個該如何理解呢?與一級指標的理解是一樣的。
int**q 可以把它分為兩部分看,即 int* 和 (*q),後面 (*q) 中的“*”表示 q 是一個指標變數,前面的 int* 表示指標變數 q 只能存放 int* 型變數的地址。對於二級指標甚至多級指標,我們都可以把它拆成兩部分。首先不管是多少級的指標變數,它都是一個指標變數,指標變數就是一個“*”,其餘的“*”表示的是這個指標變數只能存放什麼型別變數的地址。比如“int****a;”表示指標變數 a 只能存放 int*** 型變數的地址。
下面來舉一個例子。假如定義了一個指標變數 p 指向一個 int 型變數:
int i = 10;
int *p = &i;
前面講過,指標變數的“基本類型”用來指定該指標變數可以指向的變數的型別,即該指標變數只能存放什麼型別變數的地址。所以 int*p 表示 p 指向的是 int 型變數,裡面只能存放 int 型變數的地址。雖然 p 是指標變數,但只要是變數就有地址,就可以定義一個指標變數存放它:
int **q = &p;
為什麼存放 &p 要兩個“*”呢?因為指標變數 p 的基本類型為 int 型,所以 &p 的基本類型為 int*型 。所以如果要定義一個能指向 int* 型變數的指標變數,有兩個要求:首先它要是指標變數,即一個“*”;其次,該指標變數指向的是 int* 型的資料,或者說存放的是 int* 型變數的地址,所以就是 int**。
以上就是為什麼需要兩個“*”的原因。兩個“*”表示二級指標,就是指標的指標。二級指標需要兩個“*”才能指向最終的記憶體單元,即 **q==i。變數 q 中存放變數 *q 的地址,變數 *q 中存放變數 **q 的地址,變數 **q 中存放i的內容,即 10。或者說:q 指向 *q,*q 指向 **q,**q 中存放i的內容,即 10。
同樣,雖然 q 存放的是指標變數 p 的地址,但它也有地址。所以也可以定義一個指標變數,裡面存放 q 的地址:
int ***r = &q;
int***r 就等價於 int***r,所以 r 的基本類型就是 int** 型。而 q 的基本類型是 int* 型,所以 &q 的基本類型是 int** 型。所以 r 有三個“*”才能指向 q 的地址。三個“*”表示三級指標,即指標的指標的指標。三級指標需要三個“*”才能指向最終的記憶體單元,即 ***r==i。
下面來寫一個程式:
# include <stdio.h>
int main(void)
{
int i = 10;
int *p = &i;
int **q = &p;
int ***r = &q;
printf("i = %dn", ***r);
return 0;
}
輸出結果是:
i = 10
這就是多級指標,也很簡單,一定要弄清楚。