星期三, 9月 26, 2007

pointer to pointer and reference to pointer in C/C++

為什麼 C/C++ 會有指標的指標(pointer to pointer)與參考指標(reference to pointer)的存在,這裡有一篇文章解釋得很好:
http://www.codeproject.com/cpp/PtrToPtr.asp

除此之外也可以看看這篇:
http://www.eskimo.com/~scs/cclass/int/sx8.html

其實看第一篇就可以知道為什麼了,除了用來指向二維陣列之外,函式的參數傳遞才是重點,重點整理如下:
  1. ptr-to-ptr 或 ref-to-ptr 是用來解決指標參數傳遞給函式時,指標本身是 pass by value 的問題,簡單的說,就是在函式中改變指標數值,返回時會不見,因為在函式中的指標是一個複製的區域變數 (local variable)。
  2. ref-to-ptr 只有 C++ 能用,因為 reference 是 C++ 才有的。
  3. ** 不一定都是代表 ptr-to-ptr,如 main (int argc, char** argv) 實際上是 main (int argc, char* argv[]),也就是指標陣列 (array of pointers)的另一種表現方式。
  4. ptr-to-ptr 中,** 用法與 * 同,只是在原本的用法上多加一個 *,而不加 * 的那一個變數是不能修改的,否則會遺失這個變數的繫結,也沒意義。(**var = val, *var = address, var = DON'T CHANGE IT!)
  5. ref-to-ptr 中,在函式中使用指標與一般的指標用法相同,差異只是在函式的宣告中多一個 & 表示傳遞這個指標變數時以參考值傳遞如: void func(int*& rpInt)
註:第一點有提到指標是 pass by value,這是很多人的誤區,指標雖然是用來傳位址,但並不是 pass by address,指標是 pass by value (of the address),因此指標也是有型別的。

沒有留言: