顯示廣告
隱藏 ✕
看板 Programming
作者 Knuckles(阿德)
標題 [轉錄][C++] Call by Reference
時間 2010年03月08日 Mon. AM 12:57:00


※ 本文轉錄自 Knuckles_note 看板

看板 Knuckles_note
作者 Knuckles(阿德)
標題 [C++] Call by Reference
時間 2010年03月07日 Sun. PM 04:45:19


看完上兩篇之後,我們想知道有沒有什麼
可以在副程式中改變主程式的變數,然後又比用指標簡單的方法
也就是這篇要講的 Call by Reference

其實在 C語言 就只能用指標了
是到了 C++ 才多了個 參考(Reference) 這種東西讓我們用

但也不是說有 Reference,指標就沒用了
指標還可以用在很多地方,像是存取陣列、字串之類的
Reference,大概就只能用在呼叫副程式上了

先簡介一下 Reference 的用法

^LReference簡介

Reference 其實就是一個變數的別名而已

^LReference簡介

Reference 其實就是一個變數的別名而已

當我們宣告一個普通的整數變數時
	
	
	
在記憶體中長這樣:
	
	
	
	
	
	
Address
	
    Name  Value
	
int a = 5;
	
	
	
	
0x100       a       5

^LReference簡介

Reference 其實就是一個變數的別名而已

當我們宣告一個普通的整數變數時
	
	
	
在記憶體中長這樣:
	
	
	
	
	
	
Address
	
    Name  Value
	
int a = 5;
	
	
	
	
0x100       a       5

要宣告一個參考 a 的 reference 就這樣:

	
int& r_a = a;
	
	
	
	
0x100       r_a     5
	
  ↑
	
就跟要被參考的變數一樣的型態 再加上個 &

^LReference簡介

Reference 其實就是一個變數的別名而已

當我們宣告一個普通的整數變數時
	
	
	
在記憶體中長這樣:
	
	
	
	
	
	
Address
	
    Name  Value
	
int a = 5;
	
	
	
	
0x100       a       5

要宣告一個參考 a 的 reference 就這樣:

	
int& r_a = a;
	
	
	
	
0x100       r_a     5
                 ↗
	
	
直接把要被參考的變數名稱丟給剛宣告的reference就好了
	
	
要注意的是宣告reference時就要給定要被參考的對象,然後就不能改了

^LReference簡介

Reference 其實就是一個變數的別名而已

當我們宣告一個普通的整數變數時
	
	
	
在記憶體中長這樣:
	
	
	
	
	
	
Address
	
    Name  Value
	
int a = 5;
	
	
	
	
0x100       a       5

要宣告一個參考 a 的 reference 就這樣:

	
int& r_a = a;
	
	
	
	
0x100       r_a     5
                                                  ↑
                                                可以發現 r_a 跟 a 共用同一塊記憶體
	
	
	
	
	
	
只是名字不一樣,就只是個別名而已

^LReference簡介

Reference 其實就是一個變數的別名而已

當我們宣告一個普通的整數變數時
	
	
	
在記憶體中長這樣:
	
	
	
	
	
	
Address
	
    Name  Value
	
int a = 5;
	
	
	
	
0x100       a       5

要宣告一個參考 a 的 reference 就這樣:

	
int& r_a = a;
	
	
	
	
0x100       r_a     5

用法很簡單,就跟一般變數沒兩樣
只要改reference的值,被參考變數的值也會跟著變,因為是共用同一塊記憶體

直接來看用在 swap() 的例子:

^LCall by Reference

#include <iostream>
	
	
	
這是 Call by Value 的寫法
using namespace std;

void swap(int,int);
	
	
	


int main()
	
	
	
	

{
	
int a=3,b=4;
	
	
	

	
swap(a,b);
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int a, int b)
{
	
int c = a;
	
a = b;
	
b = c;
}

^LCall by Reference

#include <iostream>
	
	
	

using namespace std;

void swap(int&,int&);
	
	
	
← 輸入變數的型態改為 reference

int main()
	
	
	
	

{
	
int a=3,b=4;
	
	
	

	
swap(a,b);
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int& a, int& b)
	
	
← 輸入變數的型態改為 reference
{
	
int c = a;
	
a = b;
	
b = c;
}

^LCall by Reference

#include <iostream>
	
	
	
這樣就好了,簡單吧
using namespace std;

void swap(int&,int&);
	
	
	


int main()
	
	
	
	

{
	
int a=3,b=4;
	
	
	

	
swap(a,b);
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int& a, int& b)
{
	
int c = a;
	
a = b;
	
b = c;
}

^LCall by Reference

#include <iostream>
	
	
	
在程式還沒有執行時
using namespace std;
	
	
	
	
	
在記憶體中長這樣:
void swap(int&,int&);
	
	
	


int main()
	
	
	
	
main() 的變數:
{
	
	
	
	
	
Address  Name  Value
	
int a=3,b=4;
	
	
	
0x100    a     3
	
swap(a,b);
	
	
	
0x104    b     4
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int& a, int& b)
	
	
swap() 的變數:
{
	
	
	
	
	
Address  Name  Value
	
int c = a;
	
	
	

	
a = b;
	
	
	
	

	
b = c;
	
	
	
	

}

^LCall by Reference

#include <iostream>
	
	
	
執行到 swap(a,b); 時
using namespace std;
	
	
	
	
	
在記憶體中長這樣:
void swap(int&,int&);
	
	
	


int main()
	
	
	
	
main() 的變數:
{
	
	
	
	
	
Address  Name  Value
	
int a=3,b=4;
	
	
	
0x100    a     3
	
swap(a,b); 
	
	
	
0x104    b     4
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int& a, int& b)
	
	
swap() 的變數:
	
	
  注意在 swap() 中的 a,b
{
	
	
	
	
	
Address  Name  Value
	
  與 main() 中的 a,b 共用相同的位址
	
int c = a;
	
	
	
0x100    a     3  
	
a = b;
	
	
	
	
0x104    b     4
	
b = c;
	
	
	
	
0x200    c
}

^LCall by Reference

#include <iostream>
	
	
	
執行完 swap() 後
using namespace std;
	
	
	
	
	
在記憶體中長這樣:
void swap(int&,int&);
	
	
	


int main()
	
	
	
	
main() 的變數:
{
	
	
	
	
	
Address  Name  Value
	
int a=3,b=4;
	
	
	
0x100    a     4
	
swap(a,b); 
	
	
	
0x104    b     3
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int& a, int& b)
	
	
swap() 的變數:
	
	
  swap() 只要改了他可存取的 a,b 值
{
	
	
	
	
	
Address  Name  Value
	
  main() 中 a,b 的值也被改了
	
int c = a;
	
	
	
0x100    a     4   
	
  因為是共用同一塊記憶體啊
	
a = b;
	
	
	
	
0x104    b     3
	
b = c;
	
	
	
	
0x200    c     3
}

^LCall by Reference

#include <iostream>
	
	
	

using namespace std;
	
	
	
	
	

void swap(int&,int&);
	
	
	


int main()
	
	
	
	
main() 的變數:
{
	
	
	
	
	
Address  Name  Value
	
int a=3,b=4;
	
	
	
0x100    a     4
	
swap(a,b);
	
	
	
0x104    b     3
	
cout << "a=" << a 
	
     << ",b=" << b << endl;
	
執行結果顯示: a=4,b=3
	

	
	
	
	
	
成功的在 swap() 中修改了 main()中 a,b 的值
	
return 0;
	
	
	

}

void swap(int& a, int& b)
	
	
swap() 的變數:
	
	
 
{
	
	
	
	
	
Address  Name  Value
	
 
	
int c = a;
	
	
	

	
a = b;
	
	
	
	

	
b = c;
	
	
	
	

}



--
※ 來源: DISP BBS (http://disp.twbbs.org)
※ 作者: Knuckles  來自: 118.168.102.236  時間: 2010-03-07 16:45:19
※ 編輯: Knuckles  來自: 118.168.102.236  時間: 2010-03-07 16:47:03
※ 編輯: Knuckles  來自: 118.168.102.236  時間: 2010-03-07 16:48:06
※ 編輯: Knuckles  來自: 118.168.102.236  時間: 2010-03-07 16:49:00
※ <( ̄ー ̄)b 共 1 個人都讚這好!

--
※ 來源: DISP BBS (http://disp.twbbs.org)
※ 作者: Knuckles  來自: 118.168.102.236  時間: 2010-03-08 00:57:00
※ 看板: Programming 文章推薦值: 7 目前人氣: 0 累積人氣: 1132 
分享網址: 複製 已複製
( ̄︶ ̄)b iloveyouever, unshing, plvs015013 說讚!
1樓 時間: 2010-03-08 00:58:54 (台灣)
  03-08 00:58 TW
我也對這個板有點貢獻了 XD
2樓 時間: 2010-03-08 01:03:47 (台灣)
  03-08 01:03 TW
本來想說晚一點再轉 然後就忘記了( ̄▽ ̄#)﹏﹏
ott 轉錄至看板 ott 時間:2010-03-12 04:27:47
uefangsmith 轉錄至看板 uefacool 時間:2010-03-26 00:45:15
3樓 時間: 2010-03-26 00:45:42 (台灣)
  03-26 00:45 TW
阿德真厲害...
4樓 時間: 2010-04-05 01:44:13 (香港)
  04-05 01:44 HK
very nice slideshow in ascii form
5樓 時間: 2010-06-13 15:56:17 (台灣)
  06-13 15:56 TW
超感謝阿德!!!!!!!!!!!!!
iloveyouever 轉錄至看板 my_time_my_heart 時間:2010-08-01 19:46:39
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇