摘要:C语言的模块设计主要是通过函数实现的,函数间信息的传递主要是通过参数实现的。函数的参数传递包括传值和传址。为了区别两种传递方式的不同,采用实例和图示两种方法,列举了变量、数组名、指针作参数的实例,通过比较函数调用后形参和实参的变化,总结出函数调用时参数传递的两种规律,即基类型变量、数组元素、结构体变量作参数时是传值,也就是单向的值传递;数组名、指针作参数时是传址,也就是共享同一个地址。
关键词:传值; 传址; C语言函数; 地址共享
中图分类号:TN91134; TP311文献标识码:A文章编号:1004373X()04005502
Parameter delivery law of C language function
ZHAO Juan1, FAN Chao2
(1. North Institute of Information Engineering, Xi’an Technological University, Xi’an 710025, China;
2. Shaanxi Youth Vocational College, Xi’an 710068, China)
Abstract: C language module design is implemented mainly through the function. The information between the functions is delivered by parameters. The parameter delivery of the function includes the delivery value and delivery address. In order to distinguish the difference of the two modes, two methods of examples and illustrations are adopted. The instances which takes variable, array name and pointer as parameters are listed. By comparing the variation of formal parameter and actual parameter after function call, two laws of the parameter delivery, while the function was called, were summed up: the base type variable, array element and structure variables as parameters are passed by value, that is, they deliver information in one way; the array name and pointer as parameters are passed by address, that is, they share the same address.
Keywords: delivery value; delivery address; C language function; address sharing
收稿日期:0926在程序设计中常采用模块设计方法,实际上所谓模块设计的思想是一种“分而治之”的思想,把一个大任务分为若干个子任务,这样每一个子任务就相对简单了。程序中的子任务在C语言中通常是用函数来实现的。通过函数间的相互调用来完成程序的主要任务。参数是实现函数间信息传递的主要通道,因此掌握参数的传递方式,把握函数间的传递规律是学习C语言的关键。
1参数的传递方式
C语言函数的参数传递可以归纳为两种方式:传值和传址。下面用实例和图示两种方式进行描述。
1.1传值
传值传递方式主要出现在实参和形参都是变量的时候,如基类型变量、数组元素、结构体变量作参数时,进行的就是值传递,程序如下:
在上述的例子中,函数调用时如图1(a)所示。实参将值传给形参,形参在子函数里发生互换,但不能将互换的值传回给实参,结果如图1(b)所示。因此实参在整个过程中没有发生变化,由此可以总结当用普通变量作参数时,进行的是单向的值传递,只能实参传形参,形参无法传实参。
图1变量作参数的调用过程1.2传址
该方法中函数调用时参数间传递的地址有以下3种情况:变量的地址作参数、数组名作参数以及指针作参数。由于变量的地址作参数与指针作参数类似,这里就不再举例,主要针对数组名作参数和指针作参数进行探讨。
1.2.1数组名作参数
数组名作参数的程序如下:
void f(int t[],int n)
{int i; for(i=0;i
void main()
{ int a[4]={1,2,3,4},i; f(a,4); for(i=0;i
数组名作参数时,传递的是数组的首地址,即实参数组和形参数组共用一段内存空间,如图2(a)所示。在子函数中对数组t的所有元素进行赋值,其实也就是对数组a的所有元素进行赋值,如图2(b)所示。所以当用数组名作参数时,实参和形参共享一个数组,形参数组的改变也就是实参数组的改变,其程序如下:
void swap(int *a, int *b)
{int temp; temp=*a;*a=*b;*b=temp;}
main()
{int x=3, y=5, *p=&x, *q=&y;
swap(p,q); printf("%d,%d",*p,*q);}
图2数组名作参数的调用过程1.2.2指针作参数
指针作参数与数组名作参数类似,传递的也是地址,但此时不是共享一个数组,而是共享一个变量的地址,即实参指针和形参指针共同指向同一个变量,共享同一个变量地址如图3所示。这时有2种情况:改变形参的指向;改变形参所指向的变量。上面的例子属于第二种情况,形参指向的变量值发生变化,也就是实参指向的变量值发生变化。把此例稍做修改得如下程序:
void swap(int *a,int *b)
{int *temp; temp=a; a=b; b=temp;}
将函数稍做改动后,子函数的功能只是改变了形参指针的指向,如图4(c)所示。对实参并无影响,从而也不会影响实参所指向的变量值。
2结语
调用函数时,从参数的传递情况来看,其实质就是传值和传址,传值是变量作参数,实参只负责给形参赋初值,形参在整个过程中的改变都不影响实参,所以是单向的值传递。传址是数组名和指针作参数,此时体现的就是共享,数组名作参数,实参和形参共享一个数组,形参数组的改变就是实参数组的改变;指针作参数共享的是同一个变量的地址,即实参和形参共同指向同一个变量,当改变形参所指向的变量值时,实参所指向的变量值也一同改变,因为它们指向的是同一个变量。如果改变的是形参的指向,则不影响实参指针的改变。
图3指针作参数的调用过程1图4指针作参数的调过过程2参考文献
[1]谭浩强.C程序设计[M].北京:清华大学出版社,.
[2]杨战海,薛苏秦,张晓光.基于C语言函数参数传递规律的探讨[J].现代电子技术,,31(16):8991.
[3]马新.C语言函数间参数传递机制的探讨[J].白城师范学院学报,(6):2627.
[4]王英存.C语言教学中函数参数传递难点探讨[J].中国商界,(9):258259.
[5]李寅杰.C语言函数中的三类形参[J].辽宁师专学报:自然科学版,(3):5254.
[6]张艳华.C语言函数形参与实参之间的数据传递[J].内江科技,(9):80.
[7]张筱红,李军宇,高喜民.C语言函数形参与实参之间的数据传递[J].平顶山工学院学报,2002(3):5152.
[8]王晓青.C语言函数调用时的参数变化[J].青海大学学报:自然科学版,1998(1):5558.
[9]古丽孜拉・安尼瓦尔.C语言函数参数传递的几个问题[J]. 伊犁师范学院学报,(3):7374.
[10]杨战海,郭协潮.基于C语言函数调用获得结果的分析研究[J].现代电子技术,,30(24):102103.