c語言和c++中值傳遞、指針傳遞和引用傳遞的比較和區別:
值傳遞:
形參是實參的拷貝,改變形參的值并不會影響外部實參的值。從被調用函數的角度來說,值傳遞是單向的(實參->形參),參數的值只能傳入,
不能傳出。當函數內部需要修改參數,并且不希望這個改變影響調用者時,采用值傳遞。
指針傳遞:
形參為指向實參地址的指針,當對形參的指向操作時,就相當于對實參本身進行的操作
引用傳遞:
形參相當于是實參的“別名”,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函數的形式參數雖然也作為局部變量在棧
中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過
棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。
1 #include<iostream> 2 using namespace std; 3 //值傳遞 4 void change1(int n){ 5 cout<<"值傳遞--函數操作地址"<<&n<<endl; //顯示的是拷貝的地址而不是源地址 6 n++; 7 } 8 9 //引用傳遞10 void change2(int & n){11 cout<<"引用傳遞--函數操作地址"<<&n<<endl; 12 n++;13 }14 //指針傳遞15 void change3(int *n){16 cout<<"指針傳遞--函數操作地址 "<<n<<endl; 17 *n=*n+1;18 } 19 int main(){20 int n=10;21 cout<<"實參的地址"<<&n<<endl;22 change1(n);23 cout<<"after change1() n="<<n<<endl;24 change2(n);25 cout<<"after change2() n="<<n<<endl;26 change3(&n);27 cout<<"after change3() n="<<n<<endl;28 return true;29 }運行結果:可以看出,實參的地址為0x22ff44
采用值傳遞的時候,函數操作的地址是0x22ff20并不是實參本身,所以對它進行操作并不能改變實參的值
再看引用傳遞,操作地址就是實參地址 ,只是相當于實參的一個別名,對它的操作就是對實參的操作
接下來是指針傳遞,也可發現操作地址是實參地址
指針傳遞和引用傳遞:在C++中,指針和引用經常用于函數的參數傳遞,然而,指針傳遞參數和引用傳遞參數是有本質上的不同的:
指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞過程中,被調函數的形式參數作為被調函數的局部變量處理,即在棧中開辟了內存空間以存放由主調函數放進來的實參的值,從而成為了實參的一個副本。值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。(這里是在說實參指針本身的地址值不會變)
而在引用傳遞過程中,被調函數的形式參數雖然也作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。
新聞熱點
疑難解答
圖片精選