C++之值傳遞&指針傳遞&引用傳遞的示例詳解
1.函數(shù)基礎(chǔ)
一個函數(shù)由以下四部分組成:
- 返回類型
- 函數(shù)名
- 參數(shù)(0個或多個)
- 函數(shù)體
其中,函數(shù)的參數(shù)叫做形參,函數(shù)執(zhí)行的操作的語句塊叫做函數(shù)體
2.值傳遞
像一個這樣swap函數(shù),調(diào)用的時候,會用實(shí)參初始化swap函數(shù)對應(yīng)的形參
void Swap(int a, int b) { int tmp = a; a = b; b = tmp; }
在內(nèi)存中會拷貝一份實(shí)參的值,但是修改形參的值并不影響實(shí)參的值
測試用例
#include <iostream> void Swap(int a, int b) { int tmp = a; a = b; b = tmp; } int main() { int n = 0; int i = 1024; Swap(n, i); std::cout << "n: " << n << "\ni: " << i << std::endl; // 運(yùn)行結(jié)果 // n: 0 // i: 1024 return 0; } int n = 0; int i = n; // i是n的值的副本 i = 42;
3.指針傳遞
指針的行為和其他非引用類型一樣。當(dāng)執(zhí)行指針拷貝操作時,拷貝的是指針的值。
拷貝之后,兩個指針是不同的指針。因?yàn)橹羔樖刮覀兛梢蚤g接地訪問它所指的對象,所以通過指針可以修改它所指對象的值
void SwapPoniter(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; }
測試用例
#include <iostream> void SwapPoniter(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; // 修改了指針b指向的對象的值 b = 0; // 只改變了函數(shù)體中的內(nèi)存拷貝,實(shí)參并沒有被修改 } int main() { int n = 0; int i = 1024; int *j = &n; int *k = &i; SwapPoniter(j, k); std::cout << "j: " << *j << "\nk: " << *k << std::endl; // 運(yùn)行結(jié)果 // j: 1024 // k: 0 return 0; } int n = 0, i = 1024; int *p = &n, *q = &i; // p指向n;q指向i *p = 1024; // n的值被修改;p不變 p = q; // p現(xiàn)在指向了i;但是n與i的值都不變
傳遞指針,就是拷貝一個指針,它儲存的值是一樣的,解引用后是指向同一個對象,但是修改指針的值就是修改拷貝對象的值
在C語言中,大多數(shù)程序員都用得指針類型的形參去訪問函數(shù)的外部對象,在C++中,建議使用引用類型的形參代替指針
4.引用傳遞
引用傳遞跟指針傳遞有點(diǎn)類似,使用引用傳參,允許函數(shù)訪問,改變一個或多個實(shí)參的值
void SwapQuote(int &a, int &b) { int tmp = a; a = b; b = tmp; }
測試用例
#include <iostream> void SwapQuote(int &a, int &b) { int tmp = a; a = b; b = tmp; } int main() { int n = 0; int i = 1024; SwapQuote(n, i); std::cout << "n: " << n << "\ni: " << i << std::endl; // 運(yùn)行結(jié)果 // n: 1024 // i: 0 return 0; }
使用引用傳遞可以避免拷貝
拷貝大的類類型對象或者容器對象比較低效,甚至有的類類型(包括IO類型在內(nèi))根本就不支持拷貝操作。當(dāng)某種類型不支持拷貝操作時,函數(shù)只能通過引用形參訪問該類型的對象。
舉個例子,我們準(zhǔn)備編寫一個函數(shù)比較兩個string對象的長度。因?yàn)閟tring對象可能會非常長,所以應(yīng)該盡量避免直接拷貝它們,這時使用引用形參是比較明智的選擇。又因?yàn)楸容^長度無須改變string對象的內(nèi)容,所以把形參定義成對常量的引用
當(dāng)我們只是單純讀取實(shí)參,并不打算修改時,盡量使用常量引用
#include <iostream> void testprint(const int &a) { std::cout << "a: " << a << std::endl; } int main() { int num = 111; testprint(num); // 輸出結(jié)果 a: 111 return 0; }
使用引用傳遞返回額外信息
一個函數(shù)只能返回一個值,然而有時函數(shù)需要同時返回多個值,引用形參為我們一次返回多個結(jié)果提供了有效的途徑
舉個例子, 在剛剛的swap函數(shù)增加返回最小值與最大值
void SwapQuote(int &a, int &b, int &mix, int &max) { int tmp = a; a = b; b = tmp; a < b ? mix = a, max = b : max = a, mix = b; }
這樣我們只需要調(diào)用的時候傳入實(shí)參,即可修改實(shí)參的值
以上就是C++之值傳遞&指針傳遞&引用傳遞的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C++值傳遞 指針傳遞 引用傳遞的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++/Php/Python 語言執(zhí)行shell命令的方法(推薦)
下面小編就為大家?guī)硪黄狢++/Php/Python 語言執(zhí)行shell命令的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03C++編程析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)使用示例詳解
這篇文章主要為大家介紹了C++編程構(gòu)造函數(shù)中析構(gòu)函數(shù)及拷貝構(gòu)造函數(shù)的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11C語言驅(qū)動開發(fā)內(nèi)核特征碼掃描PE代碼段
這篇文章主要為大家介紹了C語言驅(qū)動開發(fā)內(nèi)核特征碼掃描PE代碼段,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10C語言實(shí)現(xiàn)天氣信息管理系統(tǒng)
這篇文章主要介紹了C語言實(shí)現(xiàn)天氣信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06