前面提到的觀念:
一、
假設我設了int指標變數*ptr,num=20
&符號可用來取得變數的位址
ptr=#
則*ptr有自己的位址&ptr(注意,&ptr是*ptr的位址。)
因為ptr=&num
所以ptr存放&num的位址
所以輸出ptr是輸出&num的位址
但是因為*是依位址取值運算子
所以輸出*ptr是輸出&num的位址的值20
二、
二維陣列的*(*(num+m)+n)是依址取值的意思,最外面的*號裡頭的就是指向位址,因此*(num+m)+n則是代表指向位址。】
*(num+m)+n則是代表指向位址代表可能,編譯器會給最外面的*號裡頭的內容添加一個取位址的符號&,因此二維陣列最外面的*號裡頭的用*(num+m)+n表示,添加了符號&以後變成&*(num+m)+&n,取址&和取值*會抵消,於是裡頭的就變成(num+m)+&n【因此必須用*表示,變成*(num+m)。】,就相當於上方講的&num[1]相當於num+1,所以(num+m)+&n就是把一維陣列位址(num+m)往右推一個&n位址(相當於一行兩行的行,也就是縱向的欄位。)
三、
如果先宣告指標
int *ptr;
再讓指標去指著目標則是
ptr=&x;
如果是同時宣告指標+指著目標
int *ptr=x;
和上述的寫法
int *ptr;
ptr=&x;
意思一樣應該是因為
同時宣告指標+指著目標
編譯器自己會隱式地自動定義ptr=&x;
依照
C IN A NUTSHELL 語法暨程式庫標準辭典 O'REILLY (2008年6月2刷)
頁數141~142 第九章指標
雙重指標範例
char c='A',*cPtr=&c,**cPtrPtr=&cPtr;
然後頁數142顯示
cPtrPtr指向或存放&cPtr
cPtr指向或存放&c
c指向或存放'A'
這就符合上述
同時宣告指標+指著目標
int *ptr=x;
編譯器自己會隱式地自動定義最外面*裡頭的ptr=&x;
這就符合上述
二維陣列的雙重指標,最外面的*號裡頭的就是指向位址,編譯器會給最外面的*號裡頭的內容添加一個取位址的符號&,又編譯器自己會隱式地自動定義ptr=&x,所以**cPtrPtr=&cPtr會等於&*cPtrPtr=&cPtr,取址&和取值*會抵消,就變成cPtrPtr=&cPtr,cPtrPtr指向或存放&cPtr。
而依上述(注意,&ptr是*ptr的位址。)
所以
&cPtr是*cPtr的位址。
&c是c的位址。
這個可以在下述的範例獲得證實
範例一
依照
C++教學手冊第三版 洪維恩著 旗標出版股份有限公司
頁數10-3
int n=20,*p,**pp;
p=&n;
pp=&p;
輸出結果 &n的位址=p的位址=*pp的位址,&p的位址(依上述等於*p的位址)=pp的位址(注意,*pp的位址不等於pp的位址),&pp依上述是**pp的位址所以和前面的位址都不一樣(注意,&pp不等於pp的位址),**pp=*p=n=20可能和&n的位址=p的位址=*pp的位址有關,因為如果把&n的位址=p的位址=*pp的位址取值加一個*,就變成*&n=*p=**pp→取址&和取值*會抵消,n=*p=**pp。
這也符合上述
同時宣告指標+指著目標
int *ptr=x;
編譯器自己會隱式地自動定義最外面*裡頭的ptr=&x;
所以
*p=n其實是p=&n
**pp=*p其實是*pp=&*p=p,所以才有上述的&n的位址=p的位址=*pp的位址。
如果把上述pp=&p的=左右各加2個*
變成**pp=**&p,取址&和取值*會抵消1個,變成**pp=*p。
因此注意上述的寫法
pp=&p就等於**pp=*p
範例二
依照
C最強入門邁向頂尖高手之路王者歸來
頁數11-41
int x=10;
int *p,**ptr;
p=&x;
ptr=&p;
輸出結果 &x的位址=p的位址=*ptr的位址,&p的位址(依上述等於*p的位址)=ptr的位址,&ptr依上述是**ptr的位址所以和前面的位址都不一樣,**ptr=*p=x=10。