C_and_CPP 板


LINE

※ 引述《hateexam ()》之銘言: : 為什麼這個問題-->見連結例子與其最佳答案 : http://zhidao.baidu.com/question/98153744.html : 必須用call by address才能正確傳遞函式間的結果 : 而以下寫法不用call by address也能正確回傳a[n]的結果呢 小弟不是很喜歡 Call by Address 這個說法, 還是回個文吧.... 為了簡單起見, 這邊就直接代幾個實例來說明這些東西吧.... ==== int a = 10; int b = 20; 上面兩行我定義兩個變數a, b, 變數需要記憶體來存放.... 所以對CPU來說, compile後的程式可能是這種感覺.... 記憶體位址 0x01000000, 這個位址存的數值為 10 記憶體位址 0x01000004, 這個位址存的數值為 20 如果我今天寫個function叫swap()想要交換兩個數.... swap(int n1, int n2) { int temp = n1; n1 = n2; n2 = temp; } main() { .... swap(a, b); .... } 這樣做是不行的, 因為C function只有Call by Value.... 所以swap被呼叫到的時候其實是把a, b的value copy了一份.... 將 0x01000000 裡的 value (10) copy到 0x02000000 裡頭 將 0x01000004 裡的 value (20) copy到 0x02000004 裡頭 因此你swap裡的程式碼最後只會造成下面的結果.... 去取 0x02000000 裡面的 value (10) 放進 temp 去取 0x02000004 裡面的 value (20) 放進 0x02000000 去取 temp 裡的值(10)放進 0x02000004 這個位址 所以swap()執行完以後.... 記憶體位址 0x02000000 在swap()裡最後變成了 20, 但不影響 0x01000000 裡的值 記憶體位址 0x02000004 在swap()裡最後變成了 10, 但不影響 0x01000004 裡的值 ==== 而您查到的網站寫的所謂Call by Address其實是Pass the address of the varible swap(int *p1, int *p2) { int temp = *p1; *p1 = *p2; *p2 = temp; } main() { .... swap(&a, &b); .... } 這樣做可行的是因為, 雖然swap()還是做Call by Value, 但傳入swap()的是address 而swap()接受的參數也不是原先的兩個int, 而是兩個int pointer, 即int* 將 0x01000000 這個 "value" copy到 0x02000000 裡頭 將 0x01000004 這個 "value" copy到 0x02000004 裡頭 在swap()這個function裡現在做得事就比較不一樣.... 去取 0x02000000 裡面的值當位址 (0x01000000) 裡面的 value (10) 放進 temp 去取 0x02000004 裡面的值當位址 (0x01000004) 裡面的 value (20) 放進 0x02000000 裡面的值當位址去 (0x01000000 這個位址) 去取 temp 裡的值(10)放進 0x02000004 裡面的值當位址去 (0x01000004 這個位址) 到這裡 0x01000000 裡面的值就是 20, 0x01000004 裡面的值就是 10, swap成功 ==== 回到您的sort()的問題, 把同樣的address/pointer概念引申一下吧.... int a[5] = {1, 5, 2, 8, 5}; => a[0] 的位址 0x01000000 裡的值為 1, a[1] 的位址 0x01000004 為 5, a[2] 的位址 0x01000008 為 2, 以此類推. sort(int *f1) { /* loop to sort f1[]. */} main() { .... sort(a); .... } sort()的參數f1實際上是把 a (這裡在C語言裡等同於 &a[0], 好像 &a 也是) 0x01000000 這個 "value" copy給f1 (0x02000000) 所以sort()裡對f1[]做讀寫就像swap()裡一樣直接反應在原來a[]的位址裡.... 即 0x01000000, 0x01000004, 0x01000008, 以此類推的這些位址裡.... 所以 sort(a); 與上面的 swap(a, b); 其實是以同樣的概念/原理在運作的:) ==== 以上, 這是小弟的理解, 有漏誤的地方還請大家指正....<(_ _)> 其實temp也會有對應位址, 而且parameter passing也要經過call stack的push/pop 而不是像我上面寫的那麼簡單直接copy; 上面只是簡化一些不是這裡重點的部份 如果能夠畫圖會比較好懂啦, 只是BBS上實在是不會畫Orz 至於C++的Call by Reference, 一種說法是這才是Call by Address 因為如果是用Call by Reference, 那麼swap()的例子就會變為.... swap(int &n1, int &n2) { int temp = n1; n1 = n2; n2 = temp; } main() { .... swap(a, b); .... } 不過小弟我不太會像上面一樣解釋n1, n2, 就留給其他強者補完吧^^|| --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.41.5.198
1F:推 hateexam:非常的感謝^^ 雖然我頭腦快打結了... 05/23 00:28
2F:→ hateexam:非常謝謝大大的用心了 05/23 00:28
3F:推 sunkill:推好文 05/25 10:36
4F:推 shieldsky:推詳細解說,不過我的腦筋也快打結了。 XD 09/09 20:25
5F:推 shieldsky:對了,文中的varible是少打了一個a嗎?是variable嗎? 09/09 20:28
6F:→ VictorTom:對啦~~凡po過, 必留下錯字....(羞) 09/09 21:02
7F:→ VictorTom:其實, 掛debug trace一次code就會有fu了:) 09/09 21:02
8F:推 yuanyu90221:好詳細的解說 ^^看了讓我懂了更多 ^^ 04/27 16:26







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP