Re: [問題] 試舉例說明何謂傳值呼叫.傳址呼叫.傳參 …

看板C_and_CPP (C/C++)作者 (灰狼)時間16年前 (2009/07/28 17:35), 編輯推噓5(5015)
留言20則, 5人參與, 最新討論串1/1
※ 引述《f4upig (sn)》之銘言: : 等等要考試了,麻煩各大大可以趕緊幫忙? 雖然是說我猜你已經考完了 不過不知道這篇文章對你還有沒有幫助 這是以前我們考試前 我整理給同學看的 http://www.wretch.cc/blog/grayyoung/4607287 #include <iostream.h> void test_value(int); /*引數為傳值呼叫的function*/ void test_add(int&); /*引數為傳址呼叫的function*/ int main(){ int a=5,b=5; /*定義a,b為整數型態 (等下a給傳值用function b給傳址function用)*/ /*a,b皆為5*/ cout << "a的值: " << a << " a的址: " << &a << endl ; /*印出a的值和址*/ cout << "b的值: " << b << " b的址: " << &b << endl ; /*印出b的值和址*/ test_value(a) ; /*呼叫這個function 引數為傳值呼叫a*/ test_add(b) ; /*呼叫這個function 引數為傳址呼叫b*/ /*在做完function把5改成7後 再列一次a,b的值*/ cout << "a的值: " << a << " a的址: " << &a << endl ; /*印出a的值和址*/ cout << "b的值: " << b << " b的址: " << &b << endl ; /*印出b的值和址*/ cout << "我們發現b的值改變了 因為他跟y是同一位址 修改y會修改到b" << endl ; cout << "但是a沒有改變 x只是讀他的值" ; cout << "修改x只會修改x那個位址的值 對a沒有影響" << endl ; return 0; } void test_value(int x){ /*用x來接收a的"址"*/ cout << "x的值: " << x << " x的址: " << &x << endl ; /*印出x的值和址*/ cout << "我們發現x的值和a的值一樣 但是址不一樣 因為是傳值呼叫" << endl ; x = 7 ; /*更改x的值等於7*/ cout << "x的值: " << x << " x的址: " << &x << endl ; /*再一次印出x的值和址 */ } void test_add(int& y){ /*用y來接收b的"址"*/ cout << "y的值: " << y << " y的址: " << &y << endl ; /*印出y的值和址*/ cout << "我們發現y和b的值和址都一樣 因為是傳址呼叫" << endl ; y = 7 ; /*更改y的值等於7*/ cout << "y的值: " << y << " y的址: " << &y << endl ; /*再一次印出y的值和址 */ } 執行結果 a的值: 5 a的址: 0xbfbfec40 b的值: 5 b的址: 0xbfbfec3c x的值: 5 x的址: 0xbfbfec10 我們發現x的值和a的值一樣 但是址不一樣 因為是傳值呼叫 執行x=7以後 x的值: 7 x的址: 0xbfbfec10 y的值: 5 y的址: 0xbfbfec3c 我們發現y和b的值和址都一樣 因為是傳址呼叫 執行y=7以後 y的值: 7 y的址: 0xbfbfec3c a的值: 5 a的址: 0xbfbfec40 b的值: 7 b的址: 0xbfbfec3c 我們發現b的值改變了 因為他跟y是同一位址 修改y會修改到b 但是a沒有改變 x只是讀他的值修改x只會修改x那個位址的值 對a沒有影響 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.139.4 ※ 編輯: grayyoung 來自: 140.113.139.4 (07/28 17:40) ※ 編輯: grayyoung 來自: 140.113.139.4 (07/28 17:42)

07/28 17:49, , 1F
我後來知道應該要用By value 跟 By reference 比較準確
07/28 17:49, 1F

07/28 18:17, , 2F
#include <iostream.h> 嗯...
07/28 18:17, 2F

07/28 18:57, , 3F
void test_add(int&); /* 這不是傳址@@a */
07/28 18:57, 3F

07/28 18:59, , 4F
不知道你同學考的怎麼樣@@?
07/28 18:59, 4F

07/28 19:59, , 5F
有一種說法, 傳參考(ref)呼叫就是傳址(addr)呼叫;
07/28 19:59, 5F

07/28 19:59, , 6F
把傳ptr當作傳址的不知道哪一本中文書開始自己寫的....
07/28 19:59, 6F

07/28 20:00, , 7F
那其實是傳值(value)呼叫; 所以他應該沒有寫錯....
07/28 20:00, 7F

07/28 20:02, , 8F
細節, 還是請去看 #135o9jpD 這一篇被m起來的文章:)
07/28 20:02, 8F

07/28 20:41, , 9F
= = 真的不懂上面那串字= =
07/28 20:41, 9F

07/28 21:20, , 10F
把 #到D 整串複製, 在文章列表直接選貼上....
07/28 21:20, 10F

07/28 21:20, , 11F
簡單說就是PTT文章代碼功能, 避免貼文號容易跑掉的問題.
07/28 21:20, 11F

07/28 21:34, , 12F
應該是說
07/28 21:34, 12F

07/28 21:34, , 13F
By reference 中文翻成傳址呼叫
07/28 21:34, 13F

07/28 21:35, , 14F
By value 翻成傳值呼叫
07/28 21:35, 14F

07/28 21:35, , 15F
我那時候為了簡單起見 用add (address) 代表傳址
07/28 21:35, 15F

07/28 21:36, , 16F
雖然是用原文書 可是老師上課還是會用中文 抱歉了Orz|||
07/28 21:36, 16F

07/28 21:37, , 17F
假如有觀念上的錯誤 那還真糟糕 我在去看一下V大的文章
07/28 21:37, 17F

07/28 21:38, , 18F
歐歐 所以其實我是名詞搞混
07/28 21:38, 18F

07/28 21:39, , 19F
假如這篇add都改成reference的話應該就沒錯了對吧
07/28 21:39, 19F

07/28 21:39, , 20F
我們老師沒有特別分出三種... = ="
07/28 21:39, 20F
文章代碼(AID): #1ARiPseR (C_and_CPP)
文章代碼(AID): #1ARiPseR (C_and_CPP)