Thinking in C++: 函數的參數傳遞方法

C++中函數的參數傳遞包括:值傳遞、指針傳遞、引用傳遞。

下面是一個從網上找到的解釋這三種傳遞方式的一個比較好的例子:

// test.cpp : Defines the entry point for the console application.
 //
 
 #include "stdafx.h"
 #include <iostream>
 
 using namespace std;
 
 //值傳遞
 void swap1(int p,int q)
 {
     int temp;
     temp=p;
     p=q;
     q=temp;
 }
 
 //指針傳遞,函數體內只有指針值的變化
 void swap2(int *p,int *q)
 {
     int temp;
     temp=*p;
     *p=*q;
     *q=temp;
 }
 
 //指針傳遞,函數體內只有指針的變化
 void swap3(int *p,int *q)
 {
     int *temp;
     temp=p;
     p=q;
     q=temp;
 }
 
 //引用傳遞
 void swap4(int &p,int &q)
 {
     int temp;
     temp=p;
     p=q;
     q=temp;
 }
 
 int main()
 { 
     int a=1,b=2;
     swap1(a,b);
     //swap2(&a,&b);
     //swap3(&a,&b);
     //swap4(a,b);
     cout<<a<<"  "<<b<<endl;
     return 0;
 }

請先自己想一下這四個函數哪個能實現交換a和b的功能。

答案是:swap1不能,swap2能,swap3不能,swap4能。

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的地址而已,如果查看&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的值。




發佈了95 篇原創文章 · 獲贊 10 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章