这里介绍一下,函数参数传递方式:传值与传址.希望看过后,大家对函数的了解更深刻.
一、传址方式:
传址方式是通过引用来实现在。还是我的习惯,用事实说话。看下面例子。
/*例1 程序开始*/
fun1(int &a,int &b)
//这里告诉编译器,这个函数是传址的,不是传值的,所以所引用的参数在函数退出后值会改变
{
int t;
t=a;
a=b;//这个函数实现两个值的交换。
b=t;
}
#include<stdio.h>
main()
{
int aa=8,bb=9;
printf("函数调用前:%d %d/n",aa,bb);
fun1(aa,bb);//运行结束后,aa=9,bb=8
printf("函数调用前:%d %d/n",aa,bb);
}
/*程序结束*/
所以,传址的参数传递,函数内可以改变其值。这是和传值的根本区别。
二、传值方式:
这是最常用的参数传递方式,看下面例子:
/*例2,程序开始*/
fun2(int a,int b)
{
int t;
t=a;
a=b;//这个函数尝试两个值的交换。
b=t;
}
#include<stdio.h>
main()
{
int aa=8,bb=9;
printf("函数调用前:%d %d/n",aa,bb);
fun2(aa,bb);//运行结束后,还是aa=8,bb=9
printf("函数调用前:%d %d/n",aa,bb);
}
/*程序结束*/
之所以会有这样的情况出现,是因为参数传递给函数的,只是它值的一个副本,函数对副本如何使用,都不会影响到原来的值。这就是传值方式的特点。它可以避免在函数体中,有意无意地改变了原值。值的非期望发生的改变,常是一些隐性的错误发生的原因,编译器发现不了这种错误,所以只有人工慢慢查找。所以除非极其确定要通过传址改变原值,一般都用传值方式传递参数。
/*例3 程序开始*/
fun3(int *a,int *b)
/*
这里没有引用符号,所以是传值.先不要激动,说这明明是把地址传进去了,怎么会是传值呢.
听我慢慢说,如果不信,你可以跟着我做个实验
*/
{
int *t;
t=a;
a=b;//这里也常试交换。
b=t;
}
#include<stdio.h>
main()
{
int aa[3]={1,2,3};
int bb[3]={4,5,6};
printf("%d %d",aa,bb);
fun3(aa,bb);
printf("%d %d",aa,bb);
}
/*程序结束*/
怎么样,是不是没有变?
是的,虽然指针传进函数,能对指针所指向的单元进行改动,但对指针本身却是改变不了的.