转载自 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这些是通过返回值传递分配的动态内存的,自然是不会出现内存泄露的,这个后面再说。