一、在介紹指標形參之前,先簡要說明下兩個運算子 & 和 *。
1、 取址運算子 & 用來取得其運算元的位址。取址運算子的運算元必須是在記憶體中可定址到。換句話說,該運算子只能用作函式或物件(例如左值),而不可以用於位欄位,以及那些未被儲存型別修飾符register宣告的內容。
float x, *ptr;
ptr = &x; // 合法:使得指標ptr指向x
ptr = &(x+1); // 錯誤: (x+1) 不是乙個左值
2、當已具有乙個指標,並且希望獲取它所引用的物件時,使用間接運算子 *(indirection operator),有時候會被稱為解引用運算子(dereferencing operator)。它的運算元必須是指標型別。
float x, *ptr = &x;
*ptr = 1.7; // 將1.7賦值給變數x
++(*ptr); // 並將變數x的值加1
在這個示例最後,ptr的值保持不變,但x的值變成2.7。
二、對函式來說,它所傳遞的任何引數僅僅是原來引數的乙個拷貝
如果通過指標傳遞引數,其實質仍然是值傳遞,傳遞的是位址而已。用指標傳遞引數,可以實現對實參進行改變的目的,是因為傳遞過來的是實參的位址,因此使用*a實際上是取儲存實參的記憶體單元裡的資料,即是對實參進行改變,因此可以達到目的。在使用的過程中需要通過對位址的解引用來操作其所指向的變數,同時可以通過指標的自增自減移動從而改變所指向的值,靈活度較大。
舉例說明:
程式1
#includevoid fun(int *p)
int main(void)
輸出為
程式2
#includevoid fun(int *p)
int main(void)
輸出為
程式1,明明改變了p的指向了,為什麼還是輸出1呢?
其實問題的關鍵不是指標作為形參的問題,而是函式傳參的問題。q是a的位址,以實參形式傳遞給子函式fun(),而在fun()函式內部使用時,其實p僅僅是q的拷貝值。將p的值修改為&b,只是p的指向從a轉向了b而已。而主函式中q及a都沒有發生過改變。
參考:
指標作為函式形參
先來看兩個程式 程式1 include void fun int p int main void 輸出為 程式2 include void fun int p int main void 輸出為 對於程式2,不難理解 程式1,明明改變了p的指向了,為什麼還是輸出1呢?其實問題的關鍵不是指標作為形參的...
函式形參 指標,引用,const,陣列形參
指標也是物件,也會拷貝,所以分實參指標和形參指標。在傳進函式時,實參進行拷貝,所以在函式裡改變指標值不影響實參。void reset int ip 引用不是物件,通過引用可以改變實參 void reset int i 使用引用的好處是避免了拷貝。其實也只是兩個變數名的傳遞,和變數規則一致,如果在函式...
函式形參 原型 指標 引用
寫的這些是在給學弟學妹講解時自己更深層次的理解,為別人解惑,思考過程中自己也有新的認識。更重要的,這些或許是將來某天我要放棄這行時,最後堅持的理由 曾經熱愛過的理想。一 int a 3,b 4 void f int x,int y f a,b cout二 若要使a b值發生改變如下 void f i...