在C中,我们只了解到有两种传参方式,一种是值传递,另外一种是传递指针,一般情况下我们选择使用指针传递参数。在C++中,又新增了一种传参方式,那就是引用(type &),引用传参给我们带来了更好的体验。那三者的具体区别在哪里呢?
1、值传递
值传递是一种值拷贝的操作,一般只用于传入参数使用,而且如果传入的值体积过大(比如一个结构体),在函数压栈的过程中会拷贝一份压入栈中,会影响效率。而且在函数生命周期结束后,会随函数一起消失,如不作为返回值是无法传出的。
2、指针传递
指针则解决了上面的两个问题,首先指针在32位系统下(64位系统是8字节)只有4个字节,无论数据多大,只要你将其指针传递给传输在压栈过程中只需要压一个4个字节的指针。并且在函数内部还可以通过指针修改指针指向地址中的数据以作为传出数据的作用。
3、引用传递
引用作为一个变量的别名,相当于一段内存的引用。在传递给函数时相当于包装了原变量指针的地址传递给函数,可以理解为在函数中直接使用原变量进行操作,而且这个期间不会出现拷贝的行为。引用的本质是指针,C++对裸露的内存地址(指针)作了一次包装。又取得的指针的优良特性。所以再对引用取地址,建立引用的指针没有意义。
#include <iostream> using namespace std; // 值传递,无法交换变量的值 // 另外注意:值传递和引用传递函数重载时会出现二义性 // 程序不知道该重载哪个函数来使用。 // 所以一定要避免这种情况出现 /*void swap(int a, int b) { }*/ // 指针传递,会开辟两个指针空间实现交换 void swap(int* pa, int* pb) { int tmp = *pa; *pa = *pb; *pb = tmp; } // 引用传递,可以理解为没有开辟新的空间直接使用了原变量 void swap(int& ra, int& rb) { int tmp = ra; ra = rb; rb = tmp; } int main(int argc, char* argv[]) { int x = 10; int y = 20; // 传指针 // swap(&x, &y); // 传引用 swap(x, y); cout << x << "--" << y << endl; getchar(); return 0; }