C++函數調用時的參數傳遞-3中傳遞方式

來源:互聯網
上載者:User

標籤:單元   結果   引用   top   建立   strong   原因   等於   mes   

參數傳遞即實參向形參傳遞資訊,使形參獲得對應的儲存空間及初值,C++中函數傳遞主要有3種方式:

1、按值傳遞。

以按值傳遞方式進行參數傳遞的過程為:首先計算出實參的值,然後給它所對應的形參變數分配儲存空間,該空間大小等於該形參類型的長度,然後把實參值存入到為形參分配的儲存空間裡去,該值即為形參的初值,在函數被調用時使用。而這種方式被調用的函數對實參的值改變不會有任何的影響,也就是說,即使形參的值在函數中被改變,也不會對實參值產生任何影響,實參值仍為被調用之前的值。究其原因還是實參和形參各占獨立的儲存單元,彼此之間互不影響。

按值傳遞引例:
#include <iostream>
using namespace std;
void swap(int a,int b);
int main(void)
{
    int a=1,b=2;
    cout<<"a="<<a<<",b="<<b<<endl;
    swap(a,b);
    cout<<"a="<<a<<",b="<<b<<endl;
    return 0;
}
void swap(int a,int b)
{
    int c=a;
    a=b;
    b=c;

}

運行結果為:

a=1,b=2

a=1,b=2

注意,雖然形參和實參都是a b,但它們是被分配到了不同的儲存空間,這涉及到範圍問題。

總結:(1)只有在函數被調用時,才為形參分配記憶體空間並賦予初值,當函數調用結束後,形參的記憶體空間被釋放,同時函數傳回值(如果有的話);

(2)調用函數時形參實參類型必須一致,int型對應int型,同理double型對應double型,以此類推,否則程式會出錯;

(3)C++中函數參數的求值順序也即行程順序從右向左,例如:

#include <iostream>
using namespace std;
int sum(int x,int y);
int main(void)
{
    int a,b;
    a=1;b=2;
    cout<<sum(++a,a+b)<<endl;
    a=1;b=2;
    cout<<sum(a+b,++a)<<endl;
    return 0;
}
int sum(int x,int y)
{
    return x+y;
}

運行結果為:

5

6

2,、地址傳遞。

在定義函數的時候如果將形參值定義為指標變數,則調用該函數的時候實參應為地址,這種傳遞方式即為地址傳遞。與按值傳遞不同的是,地址傳遞是將實參的儲存地址傳遞給對應形參,從而使形參指標和實參的指標都指向同一個地址,所以被調用函數中形參指標指向的地址中內容的改變同時會造成實參內容的改變。

地址傳值引例:

#include <iostream>
using namespace std;
void swap(int *,int *);
int main(void)
{
    int a=1,b=2;
    cout<<"a="<<a<<",b="<<b<<endl;
    swap(&a,&b);
    cout<<"a="<<a<<",b="<<b<<endl;
    return 0;
}
void swap(int *,int *)
{
    int c=*a;
    *a=*b;
    *b=c;
}

運行結果:

a=1,b=2

a=2,b=1

注意:此時的實參和形參仍然佔用不同的儲存單元,只是它們的指標指向的是同一個地址。

3、引用傳遞

引用是C語言所沒有而C++提供的一種新特性,引用可以看做是變數或者對象的別名,當建立引用的時候,程式用一個變數或者對象的名字初始化它,這樣引用就可以當做該變數或者對象的別名所使用,因此對引用的改變就是對變數或者對象本身的改變。引用的文法格式如下所示:

變數類型& 引用名=變數名;

例如定義一個整型變數的引用:

int a;

int& refa=a;     \\refa作為a的別名

refa=10;

a-=40;

cout<<a<<endl;

輸出結果為-30。此時系統沒有為refa分配儲存空間,它和a代表了相同的記憶體空間,對refa進行改變就是對a進行改變。引用的建立和使用引例:

#include <iostream>
using namespace std;
int main(void)
{
    int a=3,b=2;
    int &a=refa,&b=refb;
    refa=a+2;
    b=refa+1;
    cout<<refa<<" "<<a<<endl;
    cout<<refb<<" "<<b<<endl;
    refa=b;
    cout<<refa<<" "<<a<<endl;
    return 0;
}
運行結果為:

5 5

3 3

3 3

注意:(1)引用在定義的時候必須被初始化,必須指定是哪個變數或對象的別名,類型對應一致;

(2)引用僅僅是變數或者對象的別名,系統不會為它分配記憶體空間;

(3)引用一旦建立就不能被改變,即它已跟定了該變數或者對象,不能作為其它變數或對象的別名。

按值傳遞易理解但改變形參不能對實參產生影響,地址傳遞雖可以,但是在函數中多次用指標進行間接訪問會使程式難以閱讀,且易產生錯誤,而引用完美解決了上述兩個問題。引用傳遞是在函數定義時在形參前面加上“&”。

引用傳遞引例:

#include <iostream>
using namespace std;
void swap(int &,int &);
int main(void)
{
    int a=1,b=2;
    cout<<"a="<<a<<",b="<<b<<endl;
    swap(a,b);
    cout<<"a="<<a<<",b="<<b<<endl;
    return 0;
}
void swap(int &,int &)
{
    int c=a;
    a=b;
    b=c;
}

以上即為C++函數調用時的三種傳遞方式。

C++函數調用時的參數傳遞

C++函數調用時的參數傳遞-3中傳遞方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.