[C語言] 指標教學[七]: 多重指標

MuLong PuYang
5 min readDec 29, 2019

一般指標

這裡我們先宣告一個指標 *ptr1來只到變數a,這邊我們假設變數 a 的位址為0x0a,而 ptr1 的位址是 0x16,變數 a 的數值設為 10,則情況會如下圖所示

指標 ptr1

而實際在寫程式碼的時候,我們宣告了一個變數 a ,並賦值為 10,接著再宣告一個指標變數 *ptr 並指到變數 a,這時候我們去看 ptr1 所存的數值時,一定就是 a 的位址,而 *ptr 就會跟 a 的數值一樣。

以下是輸出結果,這一次是我某一次的編譯結果,每一次作業系統會給變數的虛擬記憶體位址都是不一定的,但是我們可以清楚的看到 ptr1 的數值就是存取 a 的位址,而 *ptr1 的數值當然就是跟變數 a 一樣,也就是 10

The address of a is 0x7ffe91f80e3c
The address of ptr1 is 0x7ffe91f80e40
The value of ptr1 is 0x7ffe91f80e3c
value of a: 10
value of *ptr1(point to variable a): 10

雙重指標

那我們宣告一個指標變數,可以去指一個變數,那我們可不可以宣告一個指標變數,去指這個指標,而原本的指標因為指向了一個變數,所以這個指標變數最終也會指向變數。

這樣講有點拗口,我們承襲上一例。在上一例中,有一個指標變數 ptr1 指向變數 a,而我們今天再宣告一個指標變數 **ptr2,用它來指向 ptr1,我們最終就可以用這個變數指向 a。

假定這個 ptr2 的位址為 0x22,則我們可以讓這個 ptr2 指向 ptr1,最終藉由 ptr1 指到變數 a

雙重指標 ptr2

程式碼

這裡我們用雙重指標 ptr2 來指向 ptr1。

輸出結果

以下是輸出結果,這一次是我某一次的編譯結果,每一次作業系統會給變數的虛擬記憶體位址都是不一定的

這裡我們可以看到 ptr2 所存的位址 0x7fffcbe41e38 ,其實就是 ptr1 的位址,而 *ptr2 所顯示的值一定是 ptr1 所存的數值,也就是 a 的位址,所以這個數值 0x7fffcbe41e34 一定會跟 ptr1 的數值以及 a 的位址一樣。

最後,我們可以把 **ptr2 印出來,**ptr2 最終指向了 a 並會得到 a 所存的數值,所以我們在最後 **ptr2的數值,會跟 *ptr1 以及 a 的數值一樣。

The address of a is 0x7fffcbe41e34
The address of ptr1 is 0x7fffcbe41e38
The address of ptr2 is 0x7fffcbe41e40
The value of ptr1 is 0x7fffcbe41e34
The value of ptr2 is 0x7fffcbe41e38
The value of *ptr2 is 0x7fffcbe41e34
value of a: 10
value of *ptr1(point to variable a): 10
value of **ptr2(point to variable a): 10

三重指標

那既然有雙重指標,是否也有三重指標,答案是肯定的。

我們承襲上一例雙重指標一個雙重指標變數 ptr2 指向 ptr1 的例子,這裡我們在宣告一個三重指標 ***ptr3 ,假設它的位址是 0x2e,它指向了ptr2,ptr2 再指向了 ptr1,ptr1 最終指向了變數 a

三重指標 ptr3

程式碼

這裡我們用三重指標 ptr3 來指向 ptr2。

輸出結果

以下是輸出結果,這一次是我某一次的編譯結果,每一次作業系統會給變數的虛擬記憶體位址都是不一定的

這裡我們可以看到,ptr3 的數值,一定是儲存著 ptr2 的位址,所以兩者都是0x7ffc07469ec8

*ptr3,代表著 ptr2 所儲存的數值,也就是 ptr1 的位址,所以三者的數值皆會是0x7ffc07469ec0

**ptr3,代表著,代表著 ptr1 所儲存的數值,也就是變數 a 的位址,所以三者皆為0x7ffc07469ebc

最後 ***ptr3 所呈現的,當然就是 a 的數值,兩者皆為 10,當然這個數值會與 *ptr1 與 **ptr2 相同

The address of a is 0x7ffc07469ebc
The address of ptr1 is 0x7ffc07469ec0
The address of ptr2 is 0x7ffc07469ec8
The address of ptr3 is 0x7ffc07469ed0
The value of ptr1 is 0x7ffc07469ebc
The value of ptr2 is 0x7ffc07469ec0
The value of ptr3 is 0x7ffc07469ec8
The value of *ptr2 is 0x7ffc07469ebc
The value of *ptr3 is 0x7ffc07469ec0
The value of **ptr3 is 0x7ffc07469ebc
value of a: 10
value of *ptr1(point to variable a): 10
value of **ptr2(point to variable a): 10
value of ***ptr3(point to variable a): 10

總結

多重指標的概念或許有點抽象複雜,但其實只要釐清調理,一層一層的邏輯解析,其實就可以理解箇中道理。

--

--