首先说明,函数的传值调用和传址调用在C和C++中都是合法的语法,可是引用调用就只是在C++中合法的。函数
首先给一个广为人知的例子指针
#include<stdio.h> void swap(int x, int y) { int tmp = x; x = y; y = tmp; } int main(void) { int a = 1, b = 2; printf("a=%d, b=%d\n", a, b); swap(a, b); printf("a=%d, b=%d\n", a, b); return 0; }
输出结果是
a=1, b=2
a=1, b=2
没有交换code
并无完成交换,由于在传参调用中,main调用swap时候,将实参a, b的值分别拷贝给形参x, y,而后a, b就再也不和swap有关了,swap交换的是x, y的值,可是x, y的做用域只在swap中,他们确实完成了交换,可是swap结束以后,x, y的值也就随之销毁了,因此根本不会对行参有任何影响,固然就不会实现实参的交换对象
再给出一个相似的例子作用域
#include<stdio.h> void swap(int *x, int *y) { int tmp = *x; *x = *y; *y = tmp; } int main(void) { int a = 1, b = 2; printf("a=%d, b=%d\n", a, b); swap(&a, &b); printf("a=%d, b=%d\n", a, b); return 0; }
输出结果是
a=1, b=2
a=2, b=1
完成了交换。io
缘由是这样的,传址调用实际上仍是实参到形参的拷贝,不过此次实参是要交换的两个数字的指针(即地地址),而不是要交换的两个数自己,虽然形参在swap结束后被销毁,可是形参是根据要交换的两个数的地址完成交换的,因此对这两个数字产生影响,也就完成交换编译
注意这个语法在C++里合法,可是在C里面是没有的效率
#include<stdio.h> void swap(int &x, int &y) { int tmp = x; x = y; y = tmp; } int main(void) { int a = 1, b = 2; printf("a=%d, b=%d\n", a, b); swap(a, b); printf("a=%d, b=%d\n", a, b); return 0; }
注意:这段代码若是用gcc编译会报错,由于引用调用在C里面不合法,要用g++进行编译gcc
输出结果是
a=1, b=2
a=2, b=1
完成了交换数据类型
能够看到实现了两个数字的交换,可是这里的语法和上面的两种都不同,这里并无实参到形参的拷贝,而是直接将main里面的a, b传到swap里面,因此固然交换的就是a, b的值。
上面对int类型参数进行const传递只是为了演示其功能。
对于内部数据类型的输入参数,不要将“值传递”的方式改成“const 引用传递”。不然既达不到提升效率的目的,又下降了函数的可理解性。例如void Func(int x) 不该该改成void Func(const int &x)。
只是建议在传结构体或类对象的时候使用const 参数。