论 C语言中的值传递与地址传递

(整期优先)网络出版时间:2019-12-24
/ 3

论 C语言中的值传递与地址传递

姚策 1 李丹莹 2

1. 天津轻工职业技术学院 2. 南开大学

摘要:一般情况下,调用函数时,主调函数与被调函数之间有数据传递的关系,本文讨论了C语言函数调用中的值传递与地址传递两种形式的使用方法。通过举例分析探讨,总结出了函数参数传递的一些规律,可以有效地帮助我们在学习C语言时加深理解,并从本质上分清他们的用法,以免造成意想不到的错误。

关键字:函数、值传递、地址传递、实参、形参

近年来,无论是国内,还是在国外,C语言都是广泛使用的计算机语言,它兼顾了高级语言的易用性、可移植性好等优点,又具有低级语言效率高、可直接对硬件进行操作等大部分功能,故C语言在计算机软件开发中的作用越来越卓越。

目前几乎各种型号的微型计算机都配置有C语言编译系统。这样良好的开发环境为C语言的广泛应用开辟了美好的前景。采用函数编写程序是C语言的一大特点,C程序是由若干个相对独立的函数组成的,但是各个函数处理的往往是同一批数据。所以说程序中的函数虽然是离散的,但被处理数据却是连续的。数据常常贯穿若干函数连续流动。因此,在程序运行期间,函数之间必须存在着数据的相互传递过程。C语言中,可以使用参数、返值和全局变量在函数间传递数据。其中使用参数在函数间传递数据是基础。在这里我主要论述一下它的使用方法。

在一个函数中调用另一个函数时,实参数的值传递给对应的形参数。这样就实现了把数据由调用函数传递给被调用函数。在使用参数传递数据时,可以采用两种不同的方式:(数据复制)值传递和地址传递。这两种传递方式存在着很大的区别,如果使用不当,则会产生意想不到的错误。

值传递的使用

参数是函数调用的载体。目前,我们所使用的参数都是变量参数。即实参是调用函数中的变量,形参是被调函数中的变量。在函数调用过程中,实现实参与形参的结合。在C语言程序中,采用变量参数时,实参与形参是按传值方式相结合的,也称为值传递。值传递的特点是:在函数调用过程中,实参的值传递给形参,而形参的值并不影响实参。造成这种结果的原因是:实参、形参各自独立、占用自己的存储空间。

使用值传递方式的函数间传递数据,就是把数据本身作为实参数传递给形式参数,例1:

#include

#include

main()

{floata,b,c,s,r;

floatarea(floatx,floaty,floatz);

printf("enterabc:");

scanf("%f%f%f",&a,&b,&c);

s=area(a,b,c);

printf("s=%f",s);

}

floatarea(floatx,floaty,floatz)

{floats,m;

m=(x+y+z)/2;

s=sqrt((m-x)*(m-y)*(m-z));

return(s);

}

该程序area()函数的功能是求三边长度分别为x,y,z的三角形的面积,然后返回计算结果。main()函数中为了计算任意边长的三角形的面积,调用了area()函数。在调用它时以a,b,c为实参数,其值赋予了作为形式参数的变量x,y,z,这里的a、b、c和x、y、z分别是main()函数和自定义函数area()的内部变量,它们各自占用自己的内存空间,结果s的值是由area()函数中return(s)的返回值确定的,而x、y、z的值并没影响a、b、c。

为了深入理解值传递的特点,我们来看下面一段函数,该函数的目的是为了变换两个变量的值,例2:

#include

main()

{inta,b;

voidswap(intx,inty);

printf(“\nentera,b:”);

scant(“%d%d”,&a,&b);

printf(“\na=%db=%d,a,b)

swap(a,b);

printf(“\na=%db=%d,a,b);

}

voidswap(intx,inty)

{inttemp;temp=x;x=y;y=temp;}

执行该函数,如果给a赋值10,给b赋值20,则结果为a=10b=20

从这个结果看出,a和b的值并未达到交换的目的。swap()函数在功能上是正确的,可以实现变量x和y之间的数据交换,为什么使用它不能得到正确的结果呢?这正是由值传递的特点决定的。在这个程序中,调用swap()函数时变量a和b的值传递给了x和y,并且在函数中x和y的值也被交换。但是,x和y与a和b都使用各自的内存空间,所以x和y的变化并不能影响到a和b

二、地址传递的使用

在这种方式中,以数据的地址作为实参数传递给形参,而被调用函数中对应的形式参数必须是可以接收地址值的指针变量,并且它的数据类型必须与被传递数据的数据类型相同。

地址传递的特点是:形参存放的是实参的地址是指向实参的指针,实参的地址传递给形参,形参的变化直接影响实参的取值。根据这一特点,上述例2我们可以采用地址传递方式来实现:

voidswap(int*x,int*y)

{inttemp;

temp=*x

*X=*y;

*y=temp;

}(主函数的调用语句改为:swap(&a;&n);)

函数运行结果为;

a=10b=20

由此可以看出,修改后的函数达到交换a和b两个数据的值的目的。在这个程序中,swap()函数的功能是实现两个数交换,它的形式参数x和y中两个指向int型数据的指针。在main()中调用swap()函数时,以int型变量a和b的地址,即&a和&b作为实参数。在调用过程中,a和b的地址分别传递给x和y,从而x和y分别指向了变量a和b的内存空间。这时指针的目标变量*x和*y就是变量a和b,由此看出,虽然main()中的变量a和swap()函数内部是不可见的,但是当把这两个变量的地址传递给swap()函数的两个指针x和y后,在swap()中使用*x和*y就可以处理main()中变量a和b的数据,这样就实现了数据从调用函数传递到被调用函数中。

在C语言中,值传递和地址传递是两种不同的数据传递方式,它们的共性是:实现了把数据由调用函数传递给被调用函数。(在一个函数中调用另外一个函数时,实参数的值传递给对应的形式参数)。不同点是:在值传递中,形参、实参各自独立,形参的结果不影响实参;在地址传递中,数据无论是在调用函数中,还是在被调用函数中都使用同一个存储空间,形参的结果直接影响实参。所以,我们要从本质上分清他们的用法,以免造成意想不到的错误。

参考文献:

[1]C语言程序设计教学探索[J].赵丹丹.河北农机.2016(12)