分类: 嵌入式
2016-07-04 16:06:44
C语言函数传递参数的方式有3种,即传值、传址和引用,本文通过实例来说明三者的异同。
1 传值、传址和引用的实例
1.1 实例
请先分析以下代码的输出结果,然后再阅读后面的说明(传值和传址可以在GCC编译器下编译通过,引用则无法通过编译)。
#include
/*-----------传值传参-----------*/
void Exchg1(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
printf("x = %d, y = %d\n", x, y);
}
main()
{
int a = 4,b = 6;
Exchg1(a, b);
printf("a = %d, b = %d\n", a, b);
return(0);
}
/*-----------传址传参-----------*/
void Exchg2(int *px, int *py)
{
int tmp = *px;
*px = *py;
*py = tmp;
printf("*px = %d, *py = %d.\n", *px, *py);
}
main()
{
int a = 4;
int b = 6;
Exchg2(&a, &b);
printf("a = %d, b = %d.\n", a, b);
return(0);
}
/*-----------引用传参-----------*/
void Exchg3(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
printf("x = %d,y = %d\n", x, y);
}
main()
{
int a = 4;
int b = 6;
Exchg3(a, b);
printf("a = %d, b = %d\n", a, b);
return(0);
1.2 输出结果
传值传参:x = 6,y = 4,a = 4,b = 6;
传址传参:*px = 6,*py = 4,a = 6,b = 4;
引用传参:x = 6,y = 4,a = 6,b = 4;
2 传值、传址和引用的说明
2.1 编译器的支持
引用传参是C++的语法,标准C语言没有引用传参,只有传值传参和传址传参, 如GCC编译器就不支持引用传参。
2.2 传值、传址和引用本质
2.2.1 传值
a、b将a、b的值传给x、y,实际上a、b、x和y分别是4个存储单元,Exchg1执行过程中,a和b是不参与的,仅有x和y参与,在Exchg1结束后,a和b的值是不变的,x和y由于是Exchg1的局部变量,随着函数的结束而消失。
2.2.2 传址
&a、&b将a、b的地址传给px和py,实际上a、b、px和py分别是4个存储单元,*px、*py是指向a、b存储单元指针变量,因此Exchg2对*px和*py操作也就是对a和b的存储单元的操作,a和b的值会交换。
2.2.3 引用
a、b将a、b传给x、y后,实际上a、b、x和y只有2个存储单元,即a和x是同一存储单元,b和y是同一存储单元,只是这个存储单元有两个名字而已,所以Exchg3中对x和y的操作,也就是对a和b的操作,a和b的值会交换。
2.3 引用和传址的区别
1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。