L22 mp(p, 5) 應該是很多人的困擾, 為什麼 p 這個指標不會被改成 5 還是原來的 1。
執行結果:
p: 0x1
ptr: 0x5
p: 0x1
*ptrptr: 0x5
p: 0x5
組合語言面前沒有秘密, 硬著頭皮看看吧!
L43 0x1c(%esp) 就是 c code 的
char *p=1; L46 會把 *p 也就是 1 push 到 stack。
位址 | 位址的內容 |
0x100 p | 1 |
|
|
x01000 | 5 |
0x1004 | 1 -> 5 |
0x1008 | return address |
call mp() 之後, mp() 修改的是位址 0x1004, 改成 5。對於 main() 的 p 完全沒影響。
L 55, 56 push p address (0x100) 到 stack。
位址 | 位址的內容 |
0x100 p | 1 -> 5 |
|
|
x01000 | 5 |
0x1004 | 0x100 |
0x1008 | return address |
call mp1() 之後, mp1() 修改的是位址 0x100, 改成 5。這就改變了 main() 的 p。
這就是 C 只有 call by value 的說法。
有點難懂的話, 我有個口訣:
「傳入函式要改變變數要傳
變數的指標; 要改變指標就要傳
指標的指標。」
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。