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

2021-08-21 16:20:46 字數 1646 閱讀 5220

最近寫了幾篇深層次討論陣列和指標的文章,其中提到了「c語言中,所有非陣列的形式引數傳遞均以值傳遞形式」

而關於值傳遞,指標傳遞,引用傳遞這幾個方面還會存在誤區, 所有我覺的有必要在這裡也說明一下~

下文會通過例子詳細說明哦

值傳遞:

形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),引數的值只能傳入,

不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。

指標傳遞:

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

引用傳遞:

形參相當於是實參的「別名」,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧

中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過

棧中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

理論性的就不多說,

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

1 #include2 using namespace std;

3 //值傳遞

4 void change1(int n)

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

void swapint(int &a,int &b)

2、給函式傳遞大型物件

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

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

const maxcard=100;

class set

//建構函式

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

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

...}

先考慮集合交集的實現

set operator *( set set1,set set2)

return res;

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

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

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

return res;

}三、引用返回值

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

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

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

max(x,y)+=1.0;

一條魚@

2011-12-7

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

值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。指標傳遞 形參為指向實參位址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作.引...

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

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

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

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