顯示廣告
隱藏 ✕
回 C_and_CPP 版的文章用了不少圖所以就弄了一份好讀在這裡 XD

看板 C_and_CPP
作者 LPH66 (-858993460)
標題 Re: [問題] C語言的雙重指標
時間 Thu Dec 29 17:54:34 2011


※ 引述《YaBabyKing ( 很好)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: GCC
: 問題(Question):
: 不理解詳細的運作情況
: 餵入的資料(Input):
: 預期的正確結果(Expected Output):
: 錯誤結果(Wrong Output):
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: http://ideone.com/tn7c8
: 各位程式先進,最近接觸C語言的雙重指標
: 遇到如連結上的雙重指標問題
: 雖已利用開發工具執行過了
: 但仍不懂詳細的運作情況,可否請版上先進指點一下
: 謝謝
這種時候一圖勝千文

不過這次這圖畫在 BBS 上大概要花掉半個小時

所以只好弄成圖檔貼圖了:

1  int i[]={10,20,30,40,50};
2  int *pa[]={i,i+2,i+1,i+4,i+3};
3  int **p2=pa;

到現在為止狀況是這樣  
[圖]


4  p2++;

毫無反應  只是個 +1  
[圖]


5  printf("**p2=%d\n",**p2);

所以印出來的是這一格  
[圖]


6  ++*p2;

把 *p2                
[圖]


給 +1                
[圖]


7  printf("**p2=%d\n",**p2);

所以印出來的是這一格  
[圖]


8  **p2++;

這裡有個大問題

後置 ++ 的優先序比取值的 * 先

也就是這裡是 **(p2++);

所以這裡做的事其實是先做 p2++ 之後

取它的結果            
[圖]


再取值兩次            
[圖]


然後取到的值因為沒有後續運算就扔掉了

9  printf("**p2=%d\n",**p2);

所以印出來的是這一格  
[圖]


10 ++**p2;

最後這是把 **p2      
[圖]


的值給 +1            
[圖]


11 printf("**p2=%d\n",**p2);

所以印出來的是這一格  
[圖]


這樣了解了嗎?

碰到指標時如果那些值弄過來弄過去的搞不懂的話像這樣畫個圖就會清楚很多

--
実琴:「河野!你真的就這樣被物質慾望給吸引過去了嗎?!」
亨:「只要穿著女裝擺出親切的樣子,所有必要花費就能全免,似乎一點都不壞啊。」
実琴:「難道你沒有男人的尊嚴了嗎?!」
亨:(斷然道)「沒有。在節衣縮食生活吃緊學生面前,沒有那種東西。」
                                            --プリンセス・プリンセス  第二話

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.28.91

--
※ 編輯: LPH 時間: 2020-10-31 07:51:31 (台灣)
※ 看板: Programming 文章推薦值: 7 目前人氣: 0 累積人氣: 4427 
分享網址: 複製 已複製
( ̄︶ ̄)b Knuckles, gogomako, abc1231qa, loll_loll, afai, positmit 共 6 個人 說讚!
1樓 時間: 2012-01-04 11:50:55 (台灣)
  01-04 11:50 TW
為什麼P2++  是pa往前移一格..
2樓 時間: 2012-01-04 12:27:30 (台灣)
  01-04 12:27 TW
p2本來在pa第二格,p2++後變成在pa第三格
3樓 時間: 2012-01-07 08:18:37 (台灣)
  01-07 08:18 TW
注意到我另外畫了一個圈放p2++  代表那是"p2++"這個運算式的結果
實際上在這個運算式算完時p2理論上就已經指向pa的第三格了
只是這個運算式的結果還是個指向pa的第二格的指標
4樓 時間: 2013-01-31 13:32:14 (台灣)
  01-31 13:32 TW
都看不圖了...
5樓 時間: 2013-06-18 16:10:29
  06-18 16:10
真是抱歉, ptt 上的改了這裡卻忘了改...
已經把圖片連結修正了~
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇
看板名稱: 確定(Enter) 取消(Esc) 搜尋(Space)
查詢帳號: 確定(Enter) 取消(Esc) 搜尋(Space)
搜尋: m)m文 b)進板 c)未分類 a)作者 /)標題 q)取消?[q]

搜尋 送出(Enter) 取消(Esc)

回覆文章至: f)看板 m)作者信箱 b)兩者皆是 q)取消?[f]
要引用原文嗎? y)引用原文 n)不引用 a)全部回覆 r)複製原文 q)取消?[y]
轉錄本文章於看板: 1)使用連結 2)使用複製 q)取消 ?[1]
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc) 全部(a)

確定要刪除這篇文章?(可按大U救回) 確定(Enter) 取消(Esc)

刪除理由:

確定(Enter) 取消(Esc)
加到這個分類: 確定(Enter) 下一層(→) 回上層(←) 取消(Esc)
你覺得這篇文章: 1)真讚 2)真瞎 q)取消?[1] (再選一次即可收回)
你覺得這篇文章: 1)值得推薦 2)表示反對 3)單純註解 q)取消?[3]
guest
預覽(Enter) 取消(Esc)
上傳圖片
按ctrl+Enter可輸入下一行。
guest
確定要送出? 確定(Enter) 取消(Esc) 繼續(e)
搜尋: 送出(Enter) 取消(Esc)

▏▎▍▌▋▊▉ 請按任意鍵繼續