C 值傳遞 指標傳遞 引用傳遞詳解

2021-06-20 23:20:14 字數 1795 閱讀 6827

值傳遞:

形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。

指標傳遞:

形參為指向實參位址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作.

引用傳遞:

形參相當於是實參的「別名」,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

理論性的就不多說,下面的**對此作出了細緻解釋(從實參,形參在記憶體中存放位址的角度 說明了問題的本質,容易理解 )

#include

using namespace std;

//值傳遞

void change1(intn)

//指標傳遞

void change3(int*n)

使用引用機制後,以上程式的c++版本為:

voidswapint(int&a,int&b)

2、給函式傳遞大型物件

當大型物件被傳遞給函式時,使用引用引數可使引數傳遞效率得到提高,因為引用並不產生物件的

副本,也就是引數傳遞時,物件無須複製。下面的例子定義了乙個有限整數集合的類: 

constmaxcard=100; 

class set 

//建構函式

friend set operator* (set ,set ) ; //過載運算符號*,用於計算集合的交集 用物件作為傳值引數

//friend set operator * (set & ,set & ) 過載運算符號*,用於計算集合的交集 用物件的引用作為傳值引數 

... }

先考慮集合交集的實現

set operator*( set set1,set set2)

returnres; }

由於過載運算子不能對指標單獨操作,我們必須把運算數宣告為 set 型別而不是 set * 。

每次使用*做交集運算時,整個集合都被複製,這樣效率很低。我們可以用引用來避免這種情況。

set operator*( set &set1,set &set2)

returnres; }

三、引用返回值

如果乙個函式返回了引用,那麼該函式的呼叫也可以被賦值。這裡有一函式,它擁有兩個引用引數並返回乙個雙精度數的引用:

double&max(double&d1,double&d2)

由於max()函式返回乙個對雙精度數的引用,那麼我們就可以用max() 來對其中較大的雙精度數加1:

max(x,y)+=1.0;

附**:

#include 

using namespace std;

//值傳遞

void change1(int n){

//引用傳遞

void change2(int &n){

//指標傳遞

void change3(int *n){

//c 版本

void swapint(int *a,int *b){

//c++ 版本

void swapint(int &a,int &b){

//值傳遞 

void swap(int a, int b){

C 值傳遞 指標傳遞 引用傳遞詳解

最近寫了幾篇深層次討論陣列和指標的文章,其中提到了 c語言中,所有非陣列的形式引數傳遞均以值傳遞形式 而關於值傳遞,指標傳遞,引用傳遞這幾個方面還會存在誤區,所有我覺的有必要在這裡也說明一下 下文會通過例子詳細說明哦 值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來...

C 值傳遞 指標傳遞 引用傳遞詳解

而關於值傳遞,指標傳遞,引用傳遞這幾個方面還會存在誤區,所有我覺的有必要在這裡也說明一下 下文會通過例子詳細說明哦 值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變...

C 值傳遞 指標傳遞 引用傳遞詳解

最近寫了幾篇深層次討論陣列和指標的文章,其中提到了 c語言中,所有非陣列的形式引數傳遞均以值傳遞形式 而關於值傳遞,指標傳遞,引用傳遞這幾個方面還會存在誤區,所有我覺的有必要在這裡也說明一下 下文會通過例子詳細說明哦 值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來...