转载自 C/C++中函数参数传递详解
参数传递
C++中函数的参数传递方式包括:值传递、指针传递、引用传递这三种方法。下面的代码使用这三种方式,来实现a
和b
值的交换。
1 |
|
代码中一共有四个函数,其中有两个是指针传递,但函数体内的实现不一样。下面具体分析:
值传递
swap1
函数实现的值传递,值传递传递的是实际参数的一个副本,形参p
与q
的地址和实参a
与b
的地址不一样,参数传递时只是把a
与b
的值拷贝过去了,在swap1
中对p
和q
操作只是对临时分配的栈中内容进行操作,函数执行完后形参就消失了,对原来的a
和b
不产生任何影响。所以swap1
不能完成交换a
和b
值的功能。
指针传递
swap2
和swap3
都是指针传递,swap2
函数体内交换了p
和q
指向地址的值,swap3
函数体内交换了p
和q
指向的地址。
先说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
的值是交换了的。
引用传递
引用传递时,对形参的操作等同于对实参的操作,即传递的不会是实参的副本,而就是实参。最后会交换a
和b
的值。
总结
到此,完了。当然函数参数也可以是指向指针的指针,这也是很常见的,但通常用在需要动态分配内存的地方以避免内存泄露。在使用cuda
时调用cudaMalloc
其参数就是这样,指向指针的指针。而malloc
、CPLMolloc
、new
这些是通过返回值传递分配的动态内存的,自然是不会出现内存泄露的,这个后面再说。