註冊登錄
伊莉討論區返回首頁

thelord2009的個人空間http://www99999999999.eyny.com/?5788411[收藏][複製][分享][RSS]

日誌

指標與位址間的關係詳解Part-III(雙重指標的理論應該是這樣沒錯) ... ...

已有 719 次閱讀2023-1-6 11:08 AM

前面提到的觀念
一、
假設我設了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。

路過

雞蛋

鮮花

握手

雷人

發表評論評論 (2 個評論)

回復 thelord20092023-1-8 10:24 AM
以下指標*的名稱是隨便你自己取的,因為我怕不是理工的人學程式語言會有這種疑問,所以才寫出來。
程式語言任何名稱都是自己取自己喜歡的名稱,但是要符合程式語言的撰寫邏輯+規則。

指標與位址間的關係詳解Part-III(雙重指標的理論應該是這樣沒錯)
http://www.eyny.com/blog-5788411-799595.html
的重點在於
同時宣告指標+指著目標
int *ptr=x;
編譯器自己會隱式地自動定義最外面*裡頭的ptr=&x;
所以如果**pp=*p
其實是*pp=&*p=p,所以才有上述的&n的位址=p的位址=*pp的位址。
而**pp=*p也有另外一個意思
pp=&p就等於**pp=*p
因為
如果把上述pp=&p的=左右各加2個*
變成**pp=**&p,取址&和取值*會抵消1個,變成**pp=*p。
或者
&&**pp=&&*p
然後一樣取址&和取值*會抵消
結果pp=&p
回復 thelord20092023-1-8 06:51 PM
對不起,我再雞婆一下,指標及雙重指標及位址間的關係要這樣學!

同時宣告指標+指著目標
int *ptr=x;
編譯器自己會隱式地自動定義最外面*裡頭的ptr=&x;
為什麼?
因為如果對 *ptr=x
可以變成 &*ptr=&x
取址&和取值*會抵消一個
變成ptr=&x
因此如果
**pp=*p
你也可以
&&**pp=&&*p
=的左邊取址&和取值*會抵消2個,=的右邊取址&和取值*會抵消1個
所以變成pp=&p
又最外面的*號裡頭的就是指向位址
因此
**pp的*pp及*p的p都是指向位址
你也可以**pp=*p
&**pp=&*p
=的左右邊取址&和取值*會抵消1個
所以變成*pp=p(**pp的*pp及*p的p都是指向位址)
這種教法在目前的參考書好像很難看到
所以總結以上
只要你看到類似**pp=*p
就要本能地直覺想到
pp=&p
*pp=p(**pp的*pp及*p的p都是指向位址)

facelistdoodle 塗鴉板

您需要登錄後才可以評論 登錄 | 註冊
驗證問答 換一個

Archiver|手機版|廣告|聯絡我們|廣告查詢|廠商合作|伊莉

GMT+8, 2024-5-24 01:30 AM

回頂部