看板 uefacool
作者 標題 [轉錄][轉錄][C++] Call by Reference
時間 2010年03月26日 Fri. AM 12:45:14
※ 本文轉錄自 Programming 看板
看板 Programming
作者 標題 [轉錄][C++] Call by Reference
時間 2010年03月08日 Mon. AM 12:57:00
※ 本文轉錄自 Knuckles_note 看板
看板 Knuckles_note
作者 標題 [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
→ :我也對這個板有點貢獻了 XD>>118.168.102.236 03-08 00:58
推 :本來想說晚一點再轉 然後就忘記了( ̄▽ ̄#)﹏﹏>>134.208.40.177 03-08 01:03
※ ott:轉錄至看板 ott 來自:118.166.0.65 時間:2010-03-12 04:27:47--
※ 來源: DISP BBS (http://disp.twbbs.org)
※ 作者: uefangsmith 來自: 123.110.210.226 時間: 2010-03-26 00:45:14
※ 編輯: uefangsmith 來自: 123.110.210.226 時間: 2010-03-26 00:58:41
※ 看板: uefacool 文章推薦值: 0 目前人氣: 0 累積人氣: 58
回列表(←)
分享