一围肥、傳遞、指針傳遞蜂怎、引用傳遞的概念
值傳遞:
形參是實參的拷貝穆刻,改變形參的值并不會影響外部實參的值。
從被調(diào)用函數(shù)的角度來說杠步,值傳遞是單向的(實參->形參)氢伟,參數(shù)的值只能傳入,不能傳出幽歼。當(dāng)函數(shù)內(nèi)部需要修改參數(shù)朵锣,并且不希望這個改變影響調(diào)用者時,采用值傳遞甸私。指針傳遞:
形參為指向?qū)崊⒌刂返闹羔槼闲?dāng)對形參的指向操作時,就相當(dāng)于對實參本身進行的操作引用傳遞:
形參相當(dāng)于是實參的“別名”皇型,對形參的操作其實就是對實參的操作诬烹,在引用傳遞過程中,被調(diào)函數(shù)的形式參數(shù)雖然也作為局部變量在棧中開辟了內(nèi)存空間弃鸦,但是這時存放的是由主調(diào)函數(shù)放進來的實參變量的地址绞吁。
被調(diào)函數(shù)對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調(diào)函數(shù)中的實參變量唬格。正因為如此家破,被調(diào)函數(shù)對形參做的任何操作都影響了主調(diào)函數(shù)中的實參變量颜说。
二、代碼實例
代碼:
#include<iostream>
using namespace std;
//值傳遞
void change1(int n){
cout<<"值傳遞--函數(shù)操作地址"<<&n<<endl; //顯示的是拷貝的地址而不是源地址
n++;
}
//引用傳遞
void change2(int &n){
cout<<"引用傳遞--函數(shù)操作地址"<<&n<<endl;
n++;
}
//指針傳遞
void change3(int *n){
cout<<"指針傳遞--函數(shù)操作地址 "<<n<<endl;
*n=*n+1;
}
int main(){
int n=10;
cout<<"實參的地址"<<&n<<endl;
change1(n);
cout<<"after change1() n="<<n<<endl;
change2(n);
cout<<"after change2() n="<<n<<endl;
change3(&n);
cout<<"after change3() n="<<n<<endl;
return true;
}
結(jié)果:
三汰聋、注意事項
引用的規(guī)則:
(1)引用被創(chuàng)建的同時必須被初始化(指針則可以在任何時候被初始化)脑沿。
(2)不能有NULL引用,引用必須與合法的存儲單元關(guān)聯(lián)(指針則可以是NULL)马僻。
(3)一旦引用被初始化庄拇,就不能改變引用的關(guān)系(指針則可以隨時改變所指的對象)。指針傳遞的實質(zhì):
指針傳遞參數(shù)本質(zhì)上是值傳遞的方式韭邓,它所傳遞的是一個地址值措近。值傳遞過程中,被調(diào)函數(shù)的形式參數(shù)作為被調(diào)函數(shù)的局部變量處理女淑,即在棧中開辟了內(nèi)存空間以存放由主調(diào)函數(shù)放進來的實參的值瞭郑,從而成為了實參的一個副本。
值傳遞的特點是被調(diào)函數(shù)對形式參數(shù)的任何操作都是作為局部變量進行鸭你,不會影響主調(diào)函數(shù)的實參變量的值屈张。(這里是在說實參指針本身的地址值不會變)如果理解不了大可跳過這段指針傳遞和引用傳遞一般適用于:
函數(shù)內(nèi)部修改參數(shù)并且希望改動影響調(diào)用者。對比指針/引用傳遞可以將改變由形參“傳給”實參(實際上就是直接在實參的內(nèi)存上修改袱巨,不像值傳遞將實參的值拷貝到另外的內(nèi)存地址中才修改)阁谆。
另外一種用法是:當(dāng)一個函數(shù)實際需要返回多個值,而只能顯式返回一個值時愉老,可以將另外需要返回的變量以指針/引用傳遞給函數(shù)场绿,這樣在函數(shù)內(nèi)部修改并且返回后,調(diào)用者可以拿到被修改過后的變量嫉入,也相當(dāng)于一個隱式的返回值傳遞吧焰盗。