C++函数参数传递详解

转载自 C/C++中函数参数传递详解

参数传递

C++中函数的参数传递方式包括:值传递、指针传递、引用传递这三种方法。下面的代码使用这三种方式,来实现ab值的交换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#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;
}

代码中一共有四个函数,其中有两个是指针传递,但函数体内的实现不一样。下面具体分析:

值传递

swap1函数实现的值传递,值传递传递的是实际参数的一个副本,形参pq的地址和实参ab的地址不一样,参数传递时只是把ab的值拷贝过去了,在swap1中对pq操作只是对临时分配的栈中内容进行操作,函数执行完后形参就消失了,对原来的ab不产生任何影响。所以swap1不能完成交换ab值的功能。

指针传递

swap2swap3都是指针传递,swap2函数体内交换了pq指向地址的值,swap3函数体内交换了pq指向的地址。

先说swap2,形参指针pq指向的是ab的地址,而不是像值传递那样将实参的值拷贝到另外分配的地址中,运行到函数尾时,指针pq指向的地址没变,但地址中的值变了,也即a和b地址中的变了,就是ab的值成功交换。

再来看swap3swap3运行到函数尾时,pq交换了地址,但最后函数执行完后,ab的值并未交换。
swap3中,形参pq会保存在栈中,p指向a的地址,q指向b的地址,使用temp指针完成了pq的地址交换,即p指向b的地址,q指向了a的地址,但ab地址中的值并未发生变化,这与swap2不同,swap2中是p指向的地址中的值(就是a)与q指向的地址中的值(b)交换,所以swap2执行完后ab的值是交换了的。

引用传递

引用传递时,对形参的操作等同于对实参的操作,即传递的不会是实参的副本,而就是实参。最后会交换ab的值。

总结

到此,完了。当然函数参数也可以是指向指针的指针,这也是很常见的,但通常用在需要动态分配内存的地方以避免内存泄露。在使用cuda时调用cudaMalloc其参数就是这样,指向指针的指针。而mallocCPLMollocnew这些是通过返回值传递分配的动态内存的,自然是不会出现内存泄露的,这个后面再说。

参考