Open Pin-Jiun opened 1 year ago
Pass by value vs Pass by reference
當一個參數是 pass by value,呼叫者與被呼叫者是兩個獨立的變數但使用相同的數值。如果被呼叫者更改了參數的數值,並不會影響到呼叫者本身。
當一個參數是 pass by reference,對於參數而言,呼叫與被呼叫者,都使用相同的變數。如果被呼叫者改變了參數的數值,同樣的影響會影響到呼叫者的變數。
pass by reference 與 pass by value 最大的不同就是當變數傳遞進去之後,函數中的區域變數與船進去的變數之間是否有連動
原始的C語言發明人K&R 在其原著 “The C programming language” 中即已說明, C語言只有call by value
C 不直接支持 pass by reference 因為它總使用 pass by value,但是一個程式設計師可以實作 pass by reference 藉由傳遞指標到程式設計師希望 pass by reference 的變數。
也就是說,C語言就是使用 pointer 的方法來達成 pass by reference 的效果,也就是傳遞pointer來Pass by value
那為什麼還需要有reference呢,直接用pointer傳遞不就好? C++中,在開發者的角度來看,為了減少錯誤的產生,則會使用reference 1.reference cannot be NULL,一定會傳東西進去 2.不會誤動到address, 直接使用pointer必須要小心的處理 3.使用Passing by const reference的使用可以更保障程式的開發 4.在操作物件的時候,能有更方便的操作
參考,比較好理解的稱呼為別名alias 可以指派變數或是指標變數,也就是變數的別名(參考) C++標準API中,表示的方式很常會用到reference &
別名alias
reference &
宣告變數參考 type & name = 變數名稱;
type & name = 變數名稱;
int a = 8; int & r = a; r = 10; cout << a << endl; //10 cout << r << endl; //10 a = 6; cout << a << endl; //6 cout << r << endl; //6
假設a這個變數的記憶體位置是0x0123,裡面存的數值是8 當宣告int & r = a;時,會將 r 這個參考別名的記憶體位置也設為和a一樣為0x0123 此時可以將a和r視為同一個變數,更動a就會更動r
a
0x0123
8
int & r = a;
r
宣告指標參考 type *& name = 指標名稱;
type *& name = 指標名稱;
int* b = new int; *b = 8; int* & rp = b; //rp是一個b的別名(參考),參考的型別是int* *rp = 12; cout << *b << endl; //12 cout << *rp << endl; //12
假設b這個指標變數的記憶體位置是0x1234,所指向的位置是0x5678,0x5678記憶體內存的數值是8 當宣告int* & rp = b;時,會把 指向 的記憶體位置0x5678分享給rp這個參考 也就是b這個pointer和rp會指向同一個address
b
0x1234
0x5678
int* & rp = b;
宣告的時候一定要指派,且只能指派一次
int & c; //error
void changeValue1(int & a){a = a+1;} void changeValue2(int *& b){*b = *b+1;} int main() { int i = 1; changeValue1(i); cout << i << endl; //2 int* p = new int(6); changeValue2(p); cout << *p << endl; //7 }
此時原理大致如下 <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
Pass by value vs Pass by reference
Pass by value (或叫 Call by value)
當一個參數是 pass by value,呼叫者與被呼叫者是兩個獨立的變數但使用相同的數值。如果被呼叫者更改了參數的數值,並不會影響到呼叫者本身。
Pass by reference (或叫 Call by reference)
當一個參數是 pass by reference,對於參數而言,呼叫與被呼叫者,都使用相同的變數。如果被呼叫者改變了參數的數值,同樣的影響會影響到呼叫者的變數。
pass by reference 與 pass by value 最大的不同就是當變數傳遞進去之後,函數中的區域變數與船進去的變數之間是否有連動
C語言
原始的C語言發明人K&R 在其原著 “The C programming language” 中即已說明, C語言只有call by value
C 不直接支持 pass by reference 因為它總使用 pass by value,但是一個程式設計師可以實作 pass by reference 藉由傳遞指標到程式設計師希望 pass by reference 的變數。
也就是說,C語言就是使用 pointer 的方法來達成 pass by reference 的效果,也就是傳遞pointer來Pass by value
Reference存在的理由
那為什麼還需要有reference呢,直接用pointer傳遞不就好? C++中,在開發者的角度來看,為了減少錯誤的產生,則會使用reference 1.reference cannot be NULL,一定會傳東西進去 2.不會誤動到address, 直接使用pointer必須要小心的處理 3.使用Passing by const reference的使用可以更保障程式的開發 4.在操作物件的時候,能有更方便的操作
Reference參考
參考,比較好理解的稱呼為
別名alias
可以指派變數或是指標變數,也就是變數的別名(參考) C++標準API中,表示的方式很常會用到reference &
宣告declare
宣告變數參考
type & name = 變數名稱;
假設
a
這個變數的記憶體位置是0x0123
,裡面存的數值是8
當宣告int & r = a;
時,會將r
這個參考別名的記憶體位置也設為和a
一樣為0x0123
此時可以將a
和r
視為同一個變數,更動a
就會更動r
宣告指標參考
type *& name = 指標名稱;
假設
b
這個指標變數的記憶體位置是0x1234
,所指向的位置是0x5678
,0x5678
記憶體內存的數值是8
當宣告int* & rp = b;
時,會把 指向 的記憶體位置0x5678
分享給rp這個參考 也就是b這個pointer和rp會指向同一個address宣告的時候一定要指派,且只能指派一次
參考參數
此時原理大致如下 <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
Memory | value | variable | alias -- | -- | -- | -- 0x987 | 1 | i | a 0x986 | 0x985 | p | b 0x985 | 6 | |