詳解C++ 參數的三種傳遞方式和應用場景
值傳遞
值傳遞的實質
- 將實參的值(a、b)復制到形參(m、n)相應的存儲單元中,即形參和實參分別占用不同的存儲單元。
值傳遞的特點
- 值傳遞的特點是單向傳遞,即主調函數被調用時給形參分配存儲單元,把實參的值傳遞給形參,在調用結束后,形參的存儲單元被釋放,而形參值的任何變化都不會影響到實參的值,實參的存儲單元仍保留并維持數值不變。
值傳遞的應用場景
- 適用于傳遞簡單的數據類型,如int、float、double等。傳值是將參數的值傳遞給函數,函數內部會創(chuàng)建一個新的變量來存儲該值,對該變量的修改不會影響原變量的值。
例子1:我們首先講值傳遞,并且把它的特性列出來。下面我們先看代碼:
void test(int a) {
a += 3;
cout << “a的值:” << a << “\n”
<< “a的地址:” << &a << “\n”;
}
void main()
{
int b = 10;
test(b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}這是一個簡單的值傳遞,而地址就是內存位置,學過C++的人都清楚,下面是運行的結果

根據代碼和結果我們可以知道的是值傳傳遞的參數是有自己的內存的,并且當b把自己的值傳遞進去之后,對b是沒有影響的,那么值傳遞則是等于把b的值賦給了a等于進行了一個賦值操作這就是值傳遞。
指針傳遞
指針傳遞的實質
- 所謂的地址傳遞,指的就是函數的參數是數組名或者指針。傳遞的是數組的首地址或指針的值,而形參接收到的是實參的地址,即指向實參的存儲單元,形參和實參占用相同的存儲單元,所以形參和實參是相同的。
特點
- 形參并不存在存儲空間,編譯系統(tǒng)不為形參數組分配內存。因此在數組名或指針作函數參數時所進行的傳送只是地址傳送,形參在取得該地址之后,與實參共同擁有一段內存空間,形參的變化也就是實參的變化。
運用場景
- 適用于傳遞數組、結構體等復雜的數據類型。指針傳遞是將參數的地址傳遞給函數,函數內部通過指針來訪問該變量,對該變量的修改會影響原變量的值。
例子2:接下下來我講指針傳遞,下面是指針傳遞的代碼:
void test(int *a) {
*a += 3;
cout << “a所指向地址:” << a << “\n”
<< “a的地址:” << &a << “\n”
<< “a所指向地址的值:” << *a << “\n”;
}
void main()
{
int b = 10;
test(&b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}這是一個指針傳遞,可以明顯的發(fā)現(xiàn)和值傳遞的差別,指針是存儲地址的,當我們想要把b的值傳進test()函數時,我們傳的是b的地址,然后通過b的地址,來獲得b的值,下面是結果

我們輸出的跟值傳遞不同的是什么呢,很明顯的是這次輸出的地址比值傳遞多一個地址,那這個多的地址和b的地址一模一樣,可以說明的是指針傳遞的是地址,然后還有不同的是b的值也被改變了,這就指針傳遞和值傳遞的不同。
引用傳遞
引用傳遞的實質
- 形參相當于是實參的“別名”,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函數的形式參數雖然也作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。
- 形參的地址是實參地址的映射,即擁有不同的儲存空間但是里面存放的地址相同。
特點
- 被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。
運用場景
- 適用于傳遞對象、類等復雜的數據類型。引用傳遞是將參數的引用傳遞給函數,函數內部通過引用來訪問該變量,對該變量的修改也會影響原變量的值。引用傳遞與指針傳遞相似,但使用起來更加簡潔明了。
例子3:最后一個是引用傳遞,引用傳遞,傳遞的是什么呢?它和值傳遞、指針傳遞不同的地方是什么呢,下面是代碼:
void test(int &a) {
a += 3;
cout << “a的值:” << a << “\n”
<< “a的地址:” << &a << “\n”;
}
void main()
{
int b = 10;
test(b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}在代碼上是不是發(fā)現(xiàn)和值傳遞差不多,只是參數聲明哪里比值傳遞的多了一個&符號其他的和值傳遞一樣,但是就是在參數聲明哪里多一個&符號,它就不是值傳遞,它的傳遞方式和值傳遞的是完全不一樣的,所以在寫參數聲明時,要注意不要在你需要的引用傳遞時漏了一個&符號,它們的不同之處在哪里呢,我們看輸出結果就知道了,下面是結果:

可以發(fā)現(xiàn)的是a的值和b的值是一樣的,上面我們說指針傳遞時,是輸出了一個a所指向地址的值,它的值和b的值是一樣,那么引用是不是和指針一樣傳的地址呢,其實不是的因為引用傳遞其實是等于把b作為test()函數的全局變量,為什么這樣說呢,是因為a的地址和b相同,然后a所做的所有操作都等于b做的,這a像是b的什么呢,這是名字不同,其他一樣,a其實就是b的一個別名,所以test()函數對a的所有操作,都等于對b進行,而a只是b的另外一個標識。
那么有人對引用傳遞還有疑惑對吧,&在參數處是引用在所有非參數聲明處都是獲取某個變量的地址。還有就是引用可不可以解地址對吧,其實是不可以的,我們可以看一下它如果對引用解地址的話會報什么錯誤。下面錯誤提示

它提示的*(解址符)的操作數必須是指針,意思只能對指針進行解址,對其他的類型是不能解址的。
總結:
然后我們總結一下值傳遞、指針傳遞和引用傳遞不同的地方,首先它們都是可以把值傳遞給函數的只不過是傳遞的方式不同,有一點是可以很明顯的,指針傳遞和引用傳遞都會改變b的值,值傳遞不會,這就是值傳遞和另外的區(qū)別,而指針傳遞和引用傳遞的不同的地方則是指針傳遞的是b的地址,而引用傳遞則等于給b起了一個別名,然后通過別名來操作b的值,和它所在的內存地址。
總而言之
值傳遞:形參開辟內存空間,與形參不同的地址,不能改變值。(變量名的訪問)
地址傳遞:形參不開辟內存空間,與形參相同的地址,能改變值。(地址的訪問)
引用傳遞:形參開辟內存空間,與形參相同的地址,能改變值。
到此這篇關于詳解C++ 參數的三種傳遞方式和應用場景的文章就介紹到這了,更多相關C++ 參數傳遞方式和應用場景內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

