C/C++中函數參數傳遞詳解

來源:互聯網
上載者:User

   昨天看了記憶體管理的有關內容,有一點瞭解,但不是很深入,發現之前寫代碼時有很多細節問題沒有注意到,只知道這樣做可以實現功能,卻不知道為什麼可以這樣,對於採用自己的方法造成的隱患也未知,更不曉得還有其他方法可以實現,我們知道C++強大的一個原因是因為對於一個問題的答案多種解答方法或思路,我想著也許就是它難學的原因。因為你只知道一種或極少數的實現方法,卻不知道其他的實現方法,換句話說,就是對這個東西很掌握的不是很透徹,還沒徹底弄明白。雖然有時只知道冰山一角也是可以解決問題的,但窺知全貌可以讓我們站在更高的角度,這樣在遇到問題時的思路或視野不至於狹小和局限。廢話扯多了,只是我的一個感想,我也是一個井底之蛙。進入正題。

    C或C++中函數的參數傳遞包括:值傳遞、指標傳遞、引用傳遞這三種方法,這三種方法在《程式員面試寶典》中說的很明了,這裡加上我自己的理解。

    先看原始碼,編譯環境是vc6.0,因為調試方便。功能是要實現a和b值的交換。

 1 // test.cpp : Defines the entry point for the console application. 2 // 3  4 #include "stdafx.h" 5 #include <iostream> 6  7 using namespace std; 8  9 //值傳遞10 void swap1(int p,int q)11 {12     int temp;13     temp=p;14     p=q;15     q=temp;16 }17 18 //指標傳遞,函數體內只有指標值的變化19 void swap2(int *p,int *q)20 {21     int temp;22     temp=*p;23     *p=*q;24     *q=temp;25 }26 27 //指標傳遞,函數體內只有指標的變化28 void swap3(int *p,int *q)29 {30     int *temp;31     temp=p;32     p=q;33     q=temp;34 }35 36 //引用傳遞37 void swap4(int &p,int &q)38 {39     int temp;40     temp=p;41     p=q;42     q=temp;43 }44 45 int main()46 { 47     int a=1,b=2;48     swap1(a,b);49     //swap2(&a,&b);50     //swap3(&a,&b);51     //swap4(a,b);52     cout<<a<<"  "<<b<<endl;53     return 0;54 }

共有四個函數,其中有兩個是指標傳遞,但函數體內的實現不一樣。下面具體分析

1.值傳遞

swap1函數實現的值傳遞,值傳遞傳遞的是實際參數的一個副本,如果對這句話不理解,那一步步調試看下記憶體配置情況。

執行到48行時,a和b的情況如下

接著進入swap1函數體內,如下所示

可以看到的是,p和q的地址和a與b的地址不一樣,只是把a和b的值拷貝過去了,在swap1中對p和q操作只是對臨時分配的棧中內容進行操作,函數執行完後形參就消失了,對原來的a和b不產生任何影響。所以swap1不能完成交換a和b值的功能

2.指標傳遞

swap2和swap3都是指標傳遞,swap2函數體內交換了p和q指向地址的值,swap3函數體內交換了p和q指向的地址。

先說swap2,進入swap2函數體內,如下所示

可以看到,形參指標p和q指向的是a和b的地址,而不是像值傳遞那樣將實參的值拷貝到另外分配的地址中,運行到函數尾時,如

可以看到、指標p和q指向的地址沒變,但地址中的值變了,也即a和b地址中的變了,就是a和b的值成功交換,繼續調試可以看到正確的結果,如

再來看swap3,swap3運行到函數尾時的情況如下

可以看到p和q交換了地址,但最後函數執行完後的結果又如下所示

a和b的值並未交換,這是為什麼呢?

swap3中,形參p和q會儲存在棧中,p指向a的地址,q指向b的地址,使用temp指標完成了p和q的地址交換,即p指向b的地址,q指向了a的地址,但a和b地址中的值並未發生變化,這與swap2不同,swap2中是p指向的地址中的值(就是a)與q指向的地址中的值(b)交換,所以swap2執行完後a和b的值是交換了的。

3.引用傳遞

引用傳遞時,對形參的操作等同於對實參的操作,即傳遞的不會是實參的副本,而就是實參,進入swap4函數體內如下所示

看到這個記憶體配置,很明了了吧。最後會交換a和b的值。

到此,完了。當然函數參數也可以是指向指標的指標,這也是很常見的,但通常用在需要動態分配記憶體的地方以避免記憶體泄露。在使用cuda時調用cudaMalloc其參數就是這樣,指向指標的指標。而malloc、CPLMolloc、new這些是通過傳回值傳遞分配的動態記憶體的,自然是不會出現記憶體泄露的,這個後面再說。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.