目錄
1.c++ 值傳遞、指標傳遞、引用傳遞詳解
2. c++函式的傳入引數是指標的指標(**指向位址的位址)的詳解
#includeusing namespace std;
//值傳遞
void change1(int n)
// 使用引用機制後,以上程式的c++版本為:
void swapint(int &a,int &b)
如果想通過指標引數傳遞來改變主調函式中的相關變數,那就得使用指向指標的指標,或者指標引用。
比如,在鍊錶中如果涉及到頭結點的變化,那麼是需要**,因為這裡需要修改的是位址的值。
要修改變數的值,需要使用變數型別的指標作為引數或者變數的引用。如果變數是一般型別的變數,例如int,則需要使用int 型別的指標型別int *作為引數或者int的引用型別int&。
但是如果傳入的引數的變數型別是指標型別,例如char*,那麼需要使用該型別的指標,即指向指標的指標型別
char* *,或者該型別的引用型別
char* &。
首先要清楚 :不管是傳入的引數是指標還是值,都會建立乙個副本,修改的是這個副本,而傳入的值並沒被修改。而指標之所以能傳出來是因為:我們修改的是副本指標指向的內容而不是指標指向的位址。
在我們進行記憶體管理的時候,如果想建立乙個分配空間的函式,函式中呼叫了malloc方法申請一塊記憶體區域。
先將乙個錯誤的例子,如下:
void getmemory1(char *p,int num)如何才能解決上述問題呢?return;
}void test1()
void getmemory2(char **p,int num)// **表示通過指標位址內部傳遞改變
void test2()
// 最終目的是p指向分配的給的記憶體位址的start!!
char **p 可以進行拆分(從左向右拆分) char* *p ,所以可以認為*p是乙個char *的指標(注意這裡不是p而是*p)。那麼p的內容就是乙個指向char*的指標的位址,換句話來說p是指向這個char*指標的指標。
從test2可以看出 p是乙個char*的指標, &p則是這個char*指標的位址,換句話來說 &p是指向這個char*p的指標的指標,與getmemory2()定義相符。所以在呼叫時候要使用&p而不是p。
在getmemory2()中 *p=malloc(sizeof(int)*num);
其中*p儲存了 這個分配的記憶體的位址,那麼p就是指向這個分配的記憶體位址的指標。
其實在為什麼要用指標的指標的道理很簡單:
因為vc內部機制是將函式的傳入引數都做乙個副本,如果我們傳入的用來獲取malloc分配記憶體位址的副本變化了,而我們的引數並不會同步,除非使用函式返回值的方式才能傳出去。
所以我們就要找乙個不變的可以並能用來獲取malloc記憶體位址的引數,
於是我們建立了乙個char *的指標*p(注意這裡不是char *的指標p),這個p作為傳入引數,在進入函式後,系統會為該指標建立乙個副本_p,我們讓*_p指向malloc分配的記憶體的位址(注意這裡是*_p而不是_p),_p作為指向這個分配的記憶體位址指標的指標,這樣在分配過程中_p並沒有變化。
引用傳遞的一點解疑
當乙個方法的引數為引用型別,那麼它的實參到形參的傳遞一定是引用傳遞,方法內部形參的改變會使得呼叫方傳入的實參的改變。下面先說說背景吧。之前用c winform寫了乙個小程式,其中乙個父窗體是入庫操作,這裡面有乙個按鈕是增加入庫商品,乙個datagridview是顯示本次已經選擇的要入庫的商品,最後點...
C 引用與const引用
1 在實際的程式中,引用主要被用做函式的形式引數 通常將類物件傳遞給乙個函式.引用必須初始化.但是用物件的位址初始化引用是錯誤的,我們可以定義乙個指標引用.1int ival 1092 2 int re ival ok 3int re2 ival 錯誤 4int pi ival 5int pi2 p...
從c到c 引用與常引用
下面的寫法定義了乙個引用,並將其初始化為引用某個變數。型別名 引用名 某變數名 int n 4 int r n r引用了 n,r的型別是 int 某個變數的引用,等價於這個變數,相當於該變數的乙個別名。例 int n 4 int r n r 4 cout r 輸出 4 cout n 輸出 4 n 5...