C++ 值傳遞、指針傳遞、引用傳遞

說明:

  • 函數的傳值調用傳址調用在C和C++中都是合法的語法

  • 引用調用只在C++中合法

  • C++ 文件後綴名 .cpp , C語言文件後綴名.c C++部分兼容C

值傳遞:

  • 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被調用函數的角度來說,值傳遞是單向的(實參->形參),參數的值只能傳入,
  • 不能傳出。當函數內部需要修改參數,並且不希望這個改變影響調用者時,採用值傳遞。

指針傳遞:

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

引用傳遞:

  • 形參相當於是實參的“別名”,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函數的形式參數雖然也作爲局部變量在棧中開闢了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因爲如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。

理論性的就不多說,
下面的代碼對此作出了細緻解釋(從實參,形參在內存中存放地址的角度 說明了問題的本質,容易理解 )

#include<iostream>
using namespace std;

//值傳遞
void change1(int n) {
    cout << "值傳遞--函數操作地址" << &n << endl;         //顯示的是拷貝的地址而不是源地址
    n++;
}

//引用傳遞
void change2(int &n) {
    cout<<"引用傳遞--函數操作地址"<<&n<<endl;
    n++;
}

//指針傳遞
void change3(int *n) {
    cout << "指針傳遞--函數操作地址 " << n <<endl;
    *n = *n + 1;
}

int main() {
    int n = 10;
    cout  <<"實參的值"  << n <<  "\n實參的地址" << &n << "\n\n";
    change1(n);
    cout << "after 值傳遞 n=" << n << endl << "\n";
    
    change2(n);
    cout << "after 址傳遞 n=" << n << endl << "\n";
    
    change3(&n);
    cout << "after 引用傳遞 n=" << n << endl;
    
    cin.get(); //防止cmd窗口一閃退出
    return 0;

}

在這裏插入圖片描述
可以看出,實參的地址爲0x61fe4c

  • 採用值傳遞的時候,函數操作的地址是0x61fe4c並不是實參本身,所以對它進行操作並不能改變實參的值

  • 再看引用傳遞,操作地址就是實參地址 ,只是相當於實參的一個別名,對它的操作就是對實參的操作-

  • 接下來是指針傳遞,也可發現操作地址是實參地址

那麼,引用傳遞和指針傳遞有什麼區別嗎?
引用傳遞的規則:

  • 引用被創建的同時必須被初始化(指針則可以在任何時候被初始化)。 -
  • 不能有NULL引用,引用必須與合法的存儲單元關聯(指針則可以是NULL)。
  • 引用被初始化,就不能改變引用的關係(指針則可以隨時改變所指的對象)。

指針傳遞的實質:

  • 指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞過程中,被調函數的形式參數作爲被調函數的局部變量處理,

  • 即在棧中開闢了內存空間以存放由主調函數放進來的實參的值,從而成爲了實參的一個副本。值傳遞的特點是被調函數對形式參數的

  • 任何操作都是作爲局部變量進行,不會影響主調函數的實參變量的值。(這裏是在說實參指針本身的地址值不會變)如果理解不了大可跳過這段

指針傳遞和引用傳遞一般適用於

  • 函數內部修改參數並且希望改動影響調用者。對比指針/引用傳遞可以將改變由形參“傳給”實參(實際上就是直接在實參的內存上修改,不像值傳遞將實參的值拷貝到另外的內存地址中才修改)。

  • 當一個函數實際需要返回多個值,而只能顯式返回一個值時,可以將另外需要返回的變量以指針/引用傳遞給函數,這樣在函數內部修改並且返回後,調用者可以拿到被修改過後的變量,也相當於一個隱式的返回值傳遞吧。


轉載自 : 博客園
原文鏈接 : https://www.cnblogs.com/yanlingyin/archive/2011/12/07/2278961.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章