本篇文章為大家展示了C++中有哪些傳參方式,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
漢川ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
我們都知道,在函數(shù)定義括號中的參數(shù)是形參,是給函數(shù)內(nèi)專用的局部變量,意味著函數(shù)接收到的是實參的副本,如果形參的值在函數(shù)內(nèi)部被改變,對實參是沒有影響的。
#includeusing namespace std;void change(int formalNum) { formalNum = 0; cout << "formalNum address: " << &formalNum << endl; }int main() { int realNum = 10; cout << "Before Change: " << realNum << endl; cout << "realNum address: " << &realNum << endl; change(realNum); cout << "After Change: " << realNum ; return 0; }// 執(zhí)行結(jié)果Before Change: 10realNum address: 008FFDA0 formalNum address: 008FFCCC After Change: 10
可以看見,實參和形參的地址完全不一樣,而且函數(shù)完全沒有辦法改變實參的值。值傳遞的作用更多是讓函數(shù)內(nèi)部了解外部參數(shù)的值。值傳遞是單向的,只能由實參傳向形參。
指針傳遞很好理解,形參為指向?qū)崊⒌刂返闹羔槪?dāng)對形參操作時,等同于直接通過地址操作實參。
#includeusing namespace std;void change(int *ptr) { *ptr = 0; }int main() { int realNum = 10; int* ptr = &realNum; cout << "Before Change: " << realNum << endl; change(ptr); cout << "After Change: " << realNum ; return 0; }// 執(zhí)行結(jié)果Before Change: 10After Change: 0
可以很明顯地看見,我們在函數(shù)內(nèi)部成功地修改了實參的值。是C++很常見的一種傳參方式。
引用傳遞其實是最難理解的一種傳參方式。在詳細剖析它之前,我們先說他的功能。
向函數(shù)傳遞參數(shù)的引用調(diào)用方法,把引用的地址復(fù)制給形式參數(shù)。在函數(shù)內(nèi),該引用用于訪問調(diào)用中要用到的實際參數(shù)。這意味著,修改形式參數(shù)會影響實際參數(shù)。
那么肯定有人問了,既然都是直接影響,指針和引用有啥區(qū)別呢???那區(qū)別可大了去了。
指針從本質(zhì)上是一個變量,是一個整形變量,存放的是另一個變量的地址。指針在邏輯上是獨立的,它可以被改變,甚至能改變它的值(指向其他地址),并且可以取出對應(yīng)內(nèi)存中的數(shù)據(jù)。
引用可以理解為外號,是另一個變量的同義詞,它在邏輯上具有依附性,所以C++也規(guī)定引用的在創(chuàng)立的時候就必須被初始化(現(xiàn)有一個變量,然后創(chuàng)建對該變量的引用)。而且其引用的對象在其整個生命周期中不能被改變,即自始至終只能依附于同一個變量(初始化的時候代表的是誰的別名,就一直是誰的別名,不能變)。
在引用傳遞過程中,被調(diào)函數(shù)的形式參數(shù)雖然也作為局部變量在棧中開辟了內(nèi)存空間,但是這時存放的是由主調(diào)函數(shù)放進來的實參變量的地址。被調(diào)函數(shù)對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調(diào)函數(shù)中的實參變量。正因為如此,被調(diào)函數(shù)對形參做的任何操作都影響了主調(diào)函數(shù)中的實參變量。
引用的規(guī)則:
引用被創(chuàng)建的同時必須被初始化(指針則可以在任何時候被初始化)。
不能有NULL引用,引用必須與合法的存儲單元關(guān)聯(lián)(指針可以有野指針,可以指向NULL)。
一旦引用被初始化,就不能改變引用的關(guān)系(指針則可以隨時改變所指的對象)。
看了這么多,指針傳遞和引用傳遞的用處是什么呢?
函數(shù)內(nèi)部修改參數(shù)并且希望改動影響調(diào)用函數(shù)。對比指針/引用傳遞可以將改變由形參“傳給”實參(實際上就是直接在實參的內(nèi)存上修改);
當(dāng)一個函數(shù)實際需要返回多個值,而只能顯式返回一個值時,可以將另外需要返回的變量以指針/引用傳遞。
下面看具體操作:
引用變量的定義方法和常規(guī)變量類似,但是其數(shù)據(jù)類型和名稱之間有一個 & 符號。例如,以下函數(shù)定義使形參 refNum 成為引用變量:
#includeusing namespace std;void change(int& refNum) { refNum = 0; cout << "reference address: " << &refNum << endl; }int main() { int realNum = 10; cout << "Before Change: " << realNum << endl; cout << "realNum address: " << &realNum << endl; change(realNum); cout << "After Change: " << realNum ; return 0; }// 執(zhí)行結(jié)果Before Change: 10realNum address: 00A4F9F4 reference address: 00A4F9F4 After Change: 0
可以看見,引用傳遞成功地改變了參數(shù)的值,同時形參的地址和實參的地址其實是一模一樣的。
在學(xué)完數(shù)據(jù)結(jié)構(gòu)和算法后,我對其又有新的認(rèn)識。
void func(nodeList* &Node){// 這里對Node進行了操作}
上述內(nèi)容就是C++中有哪些傳參方式,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。