1. 程式人生 > >大致瞭解了C++中的函式引數傳遞

大致瞭解了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的值。