c++中值傳遞,址傳遞,引用傳遞


概念詳解

1. 值傳遞:

  形參是實參的拷貝,改變形參的值並不會影響外部實參的值。

  從被調用函數的角度來說,值傳遞是單向的(實參->形參),參數的值只能傳入,不能傳出;

  當函數內部需要修改參數,並且不希望這個改變影響調用者時,采用值傳遞。

2. 指針傳遞

  形參是指向實參地址的指針,當對形參的指向操作時,就相當於對實參本身進行的操作

3. 引用傳遞

  形參相當於是實參的“別名”,對形參的操作其實就是對實參的操作。

  在引用傳遞過程中,被調函數的形式參數 作為局部變量 在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。

  被調函數對形參的任何操作都被處理成間接尋址,即 通過棧中存放的地址訪問主調函數中的實參變量。

  正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。

三、引用和指針 對比

1. 相同點

  都是地址的概念;

  指針指向一塊內存,它的內容是所指內存的地址;

  引用則是某塊內存的別名。

2. 不同點

  指針是一個實體,而引用僅是個別名;

  引用只能在定義時被初始化一次,之后不可變;指針隨時可變;

  const:引用只有 const int& a;(引用所指向的值不可以變);沒有int& const a;(引用本身即別名不可變,這是當然的,所以不需要這種形式);指針均有;

  引用不能為空,指針可以為空;

  引用是類型安全的,而指針不是;(引用比指針多了類型檢查)

  sizeof 引用 的到是所指向的變量(對象)的大小,而sizeof 指針得到的是指針本身的大小

四、應用

引用傳遞的性質像 指針傳遞,但是書寫像 值傳遞。

值傳遞:

void Func1(int x)

{

  x = x+1;

}

指針傳遞:

void Func1(int *x)

{

  *x = *x +1;

}

引用傳遞:

void Func1(int &x)

{

  x = x+1;

}

實際上,用“引用”可以做的任何事情“指針”也能夠做,但是為什么還要“引用“?

->指針太靈活,可以毫無約束地操作內存中的任何東西,盡管指針功能強大,但是非常危險;

如果的確只需要借用下 某個 對象的 別名, 那么就用引用,以免發生意外。

 

以下代碼很好的說明了問題

 1 #include<iostream>
 2  
 3 using namespace std;
 4  
 5 //值傳遞
 6  void change1(int n){
 7     cout<<"值傳遞--函數操作地址"<<&n<<endl;         //顯示的是拷貝的地>   址而不是源地址 
 8     n++;
 9 }
10                                                                        
11 //引用傳遞
12 void change2(int & n){
13     cout<<"引用傳遞--函數操作地址"<<&n<<endl;
14     n++;
15 }
16  //指針傳遞
17 void change3(int *n){
18      cout<<"指針傳遞--函數操作地址 "<<n<<endl;
19     *n=*n+1;
20  }      
21 int     main(){
22     int n=10;
23     cout<<"實參的地址"<<&n<<endl;
24     change1(n);
25     cout<<"after change1() n="<<n<<endl;
26     change2(n);
27     cout<<"after change2() n="<<n<<endl;
28     change3(&n);
29     cout<<"after change3() n="<<n<<endl;
30     return true;
31 }

結果如下

qqtsj@qqtsj-Nitro-AN515-51:~/cpp$ g++ -o tate1 tate1.cpp
qqtsj@qqtsj-Nitro-AN515-51:~/cpp$ ./tate1
實參的地址0x7ffd1ee21884
值傳遞--函數操作地址0x7ffd1ee2186c
after change1() n=10
引用傳遞--函數操作地址0x7ffd1ee21884
after change2() n=11
指針傳遞--函數操作地址 0x7ffd1ee21884
after change3() n=12

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM