1-10 參考參數與指標


阿瑟 發表



利用 參考參數 (reference parameter) 以及 指標 (pointer) 可讓數值傳遞的時候節省記憶體空間.

*注意: C++所有語法大小寫有差. 如果您在執行時發現中文無法顯示請自行將程式修改成英文.

*注意: 如果您執行程式後, 程式視窗會自動關閉的話, 請至MS-DOS模式重新執行程式, 或是在void main()最底端加上system("PAUSE");來暫停程式.



一般的參數都是直接傳遞整個數值 (開啟新的記憶體位置), 如果只基本資料型態還好, 但是如果是傳遞資料結構的話, 那就很浪費記憶體空間了.

在介紹參考參數之前, 小弟先介紹一下指標.
簡單的說, 指標是一種特別的變數, 他紀錄的是一個記憶體位置.

在使用指標的時候你會用到兩種符號, 星號 (*) 與 ampersand (&).
(*) 的作用是 宣告指標, 如 int *u,, 就是宣告一個名稱為 u 的指標, 而這個指標指向的記憶體位置存的是一個整數.
星號的另外一個作用就是取得指標位置所存的數值, 如果名為 u 的指標已經存了一個整數, 要取得這個整數的數值你可以用 *u 來取得.

而 (&) 的作用則是和星號正好相反, 他是取得一個變數的記憶體位置, 一個一般的整數變數, 如 int x, 要取得這個變數的記憶體位置可以用 &x 來存取.

先來看個指標的範例:



#include <iostream.h>
#include <stdlib.h>



void main()
{
   int g = 3;
   int *mem = &g;
   
   cout << mem << endl;
   cout << *mem << endl;

   system("PAUSE");

}  



編譯並且執行這隻程式.

如果執行無誤的話您應該會在螢幕上看到一個記憶體位置與一個3.

來討論一下這隻程式的原始碼:

int g = 3; 這是一個典型的整數變數
int *mem = &g 這是一個整數指標, 他指向變數 g 的記憶體位置
cout << mem 由於mem本身是一個指標, 輸出的是一個記憶體位置
cout << *mem 這行會輸出mem指向記憶體位置的數值, 也就是 3

由於mem是指向 變數 g 的記憶體位置, 因此如果你在程式中加上一行:
*mem =5
你會發現除了 *mem 的輸出變成 5, 連變數 g 的數值也變成5了. 因為他們指向同樣的記憶體位置, 因此數值是一樣的.




這種記憶體位置傳遞的理念在函式寫作的時候也會用到, 之前介紹的參數為 一般參數, 這種參數傳遞後會將數值存在另一個記憶體位置, 也就是有兩個記憶體位置存著相同的數值了. 當然在傳遞基本資料型態的時候是沒有什麼問題, 但是如果今天你傳遞的參數是體積龐大的資料結構, 用一般參數傳出就不是很符合效益.

因此有了新的傳遞方式, 叫 參考參數 (refernece parameter), 他與指標很類似, 他會將一個記憶體位置傳遞過去.

來看看這個比較一般參數與參考參數的範例:



#include <iostream.h>
#include <stdlib.h>

void fun(int & x, int y);

void main()
{
   int g =3 , h = 3;
 
   fun(g, h);
   cout << g << endl;
   cout << h << endl;

   system("PAUSE");

}  

void fun(int & x, int y)
{
   x += 3;
   y += 3;
}


這個範例中宣告了 g 與 h兩個變數, 數值都是3
兩個變數用參數的方式傳遞至 fun() 函式中, g是以參考參數, h則是以一般參數. 執行完fun()以後輸出數值, 你會發現原先的 變數 g 數值改變了, 這是因為記憶體位置內的數值在執行fun()的時候已經被修改了.

在這邊或許一個或是兩個記憶體位置的差別並不大, 但是如果你傳遞的是一個巨大的陣列或是類別, 系統處理時間在兩種參數下的差異就很大了.

*注意: 指標 (*) 星號只有在宣告的時候需要用到, 平時存取記憶體位置並不需要加上星號; 參考變數亦是如此, 只有在宣告的時候才需要用到 (&). 您只要記得, 在宣告以外的時候, (*) 的作用是取得記憶體位置存的數值, (&) 則是取得變數的記憶體位置.

最後更新日期: 5/31/2003 2:55:58 PM