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