我觉得我们首先的明确几个概念然后再去理
1. 首先标准的C语言中没有引用传参,而只有传值传参和地址传参俩种。但现在由于编译器的不同以及对C++的兼容导致可以进行引用传值
找来了网上讨论的几个的例子
void Exchg1(int x, int y) { int tmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d ", x, y); } main() { int a = 4,b = 6; Exchg1(a, b); printf("a = %d, b = %d ", a, b); return(0); }
当然有时候我们为了看的更清楚也可以这么测试
#include "stdio.h" void Exchg2(int *px, int *py) { printf("px =%p......py=%p ",px,py); int tmp=*px; *px=*py; *py=tmp; printf("px =%p......py=%p ",px,py); printf("*px=%d,*py=%d ",*px,*py); } int main() { int a=4; int b=6; printf("交换前&a = %p,&b=%p ",&a,&b); Exchg2(&a,&b); printf("交换后&a = %p,&b=%p ",&a,&b); printf("a=%d,b=%d ", a, b); return 0; }
例子2.
#include "stdio.h" void Exchg2(int *px, int *py) { int tmp = *px; *px = *py; *py = tmp; printf("*px = %d, *py = %d. ", *px, *py); } int main() { int a = 4; int b = 6; Exchg2(&a, &b); printf("a = %d, b = %d. ", a, b); return(0); }
例子3(ps:在最开始时候我们已经说过了 C语言是没有引用传递的所以这个例子你可以在X.cpp中运行)
#include "stdafx.h" void Exchg3(int &x, int &y) { int tmp = x; x = y; y = tmp; printf("x = %d,y = %d ", x, y); } int main() { int a = 4; int b = 6; Exchg3(a, b); printf("a = %d, b = %d ", a, b); return 0; }
我们对第1个例子进行一下分析
Exchg1(a, b)时所完成的操作代码如下所示。
int x = a; /* ← 注意这里,头两行是调用函数时的隐含操作 */
int y = b; /* ← 注意这里,头两行是调用函数时的隐含操作 */
{ //典型的做交换的代码
int tmp;
tmp = x;
x = y;
y = tmp;
}
这个函数之中只是对 传进来的两个参数做了一次交换操作,必然和实参没有半毛钱的关系。
void Exchg2(int *px, int *py) { int *px = &a; /* ← 注意这里,头两行是调用函数时的隐含操作 */ int *py = &b; /* ← 注意这里,头两行是调用函数时的隐含操作 */ int tmp = *px; /* ← 交换操作,只不过这次交换的地址 */ *px = *py; *py = tmp; printf("*px = %d, *py = %d. ", *px, *py); }
做一些函数里边隐含操作的可以更方便的理解函数,这个其实和上边差不多,只是隐含操作从 int px = a → int *px = &a;
如果懂得基本原理我想我是没有必要讲解一下去了。
在第三个例子中我们会发现和第二个例子出现的结果是一样。它的原理其实和第二个是相同的。这样函数里头操作的其实就是实参a、b本身了,也就是说函数里是可以直接修改到a、b的值了。
结论:
值传递在定义处是:Exchg1(int x, int y);
引用传递在这义处是:Exchg3(int &x, int &y);
值传递:Exchg1(a, b);
引用传递:Exchg3(a, b); (ps:调用的格式是相同的哦)