基于C语言函数参数传递规律的探讨

时间:2022-04-10 06:56:23

基于C语言函数参数传递规律的探讨

摘 要:函数是C语言的基本单位,函数的参数传递采用单向的值传递方式。当指针作为函数参数时,进行的是地址传递,地址传递依然是单向的值传递方式,并不是双向的传递方式。使用局部变量的有关知识,用图示法分析探讨函数的各种参数传递形式,通过探讨,总结了函数的参数传递规律。图示分析方法是一种全新的分析工具,有一定的推广价值。

关键词:值传递;地址传递;局部变量;图示法

中图分类号:TP311 文献标识码:B 文章编号:1004373X(2008)1608903

Discussion of Parameter Delivery Law Based on C Language Function

YANG Zhanhai,XUE Suqin,ZHANG Xiaoguang

(Computer Center,Yan′an Unversity,Yan′an,716000,China)

Abstract:The function is basical unit of C language,the function parameter delivery adopts transfer way of oneway value.While guiding principle is the function parameter,being in progress is address delivery,as before,address delivery is oneway value transfer way,is really not twoway delivery way.Using relevant part variable knowledge,the various parameter using diagrammatic representation is discussed.By discussion,parameter′s dilivery law of the function is proposed.Graphic analysis method in culture is a kind of brandnew analysis implement,has certain extension value.

Keywords:value delivery;address delivery;part variable;diagrammatic representation metrod

学习和使用C语言,都会遇到函数的参数传递问题,在编写的一些程序里,主调函数调用了被调用函数后,主调函数中的有些变量发生了变化,尤其是在使用指针的情况下更是如此,基于此点,有人误以为,指针作为函数参数时的地址传递是双向的传递方式。

本文以局部变量的概念为基石,采用一种内存图示分析方法。使用该方法,探讨了函数的各种参数传递形式,对参数的传递规律进行深刻的总结。

1 自动局部变量

自动局部变量是函数内部或复合语句内部定义的auto类别的变量,该变量在内存的动态区中开辟,作用范围仅限于函数内部或复合语句内部,只有函数或复合语句能够识别自己的自动局部变量,即自动局部变量对于其他函数而言是不可知的、不可见的。

另外,自动局部变量的生存期也是非常短暂的,当其所在函数被调用时,分配内存单元,调用结束后,释放变量。在下次调用函数时,重新分配内存单元。

形式参数属于局部变量,作用范围仅在所定义的函数中,形参的变化不能被别的函数可见,包括主调函数也不可见。若形式参数为自动局部变量,调用结束后根本就不存在了,更不会被主调函数可见。

按照上面的分析,形参绝不可能把自己调用到主调函数里的,所以,函数的参数的传递应该是单向的。

既然局部变量互不干扰,为简单起见,可以把主调函数和被调用函数的变量画在不同的区域以示区别。为此,特约定,画内存图时以水平线为分界,水平线以下为主调函数的局部变量,水平线以上为被调用函数的局部变量。

下面,便应用以上理论和画图的方法分析几个典型的程序,用以研究函数的参数传递规律。

2 不涉及指针的参数传递

有如下程序,用于交换2个变量的值。交换的思想是把实参变量传递给形参变量后,交换形参变量的值,希望带动2个实参变量的值的改变。

void fun(int a,int b)

{ int t; t = a; a = b; b = t;}

void main(viod)

{ int a = 6,b = 9; fun(a,b); printf ("%d,%d\\n",a,b);}

但程序的执行结果并未实现实参变量值的交换,这说明形参的变化不能影响实参的值,传递是单向值传递的。

下面,便用图示法进行分析探讨。

主程序执行后,变量及其值如图1(a)所示。调用函数fun后,分配的变量及其值如图1(b)所示,此时形参从实参处获得了对应的值。

函数fun中的变量交换,是局部变量的交换,交换结果如图2(a)所示。函数fun调用结束后,释放其所申请的局部变量,结果如图2(b)所示。

显而易见,形参的变化是被调用函数内部的变化,根本不涉及实参的变化,值的单向传递得到肯定。

3 涉及指针的参数传递

3.1 指针形参的改变

下面的程序采用指针参数,函数fun进行2个指针参数变量的值的交换。

void fun(int *p,int *q)

{ int *t; t=p; p=q; q=t;}

void main(void)

{ int a=6,b=9,*p=&a,*q=&b;

fun(p,q); printf ("%d,%d\\n",a,b);}

主程序执行后,变量及其值如图3(a)所示,实参指针p的值为&a,表示指向变量a,实参指针q的值为&b,表示指向变量b。调用函数fun后,分配的变量及其值如图3(b)所示,此时形参从实参处获得了对应的值,其中形参指针p的值为&a,表示指向主调函数中的变量a,实参指针q的值为&b,表示指向主调函数中的变量b。

函数fun中的p和q交换,是局部变量的交换,交换结果如图4(a)所示,p指向了b,q指向了a。函数fun调用结束后,释放其所申请的局部变量,结果如图4(b)所示。

主函数中p和q是实参,而调用函数fun后,p和q没有发生改变,这说明形参的变化没有改变实参的指向,即没有改变实参的值,指针作参数时,值的单向传递得到了肯定。另外,形参指针p和q曾分别指向主函数中a和b,而主函数中a和b也没有发生改变,这说明,仅改变形参指针的值,不会影响主调函数中其他变量的值,不能改变其指向变量的值。

3.2 指针形参指向变量的改变

下面的程序采用指针参数,函数fun进行2个指针参数指向变量的值的交换。

void fun(int *p,int *q)

{ int t; t=*p; *p=*q; *q=t;}

void main(void)

{ int a=6,b=9,*p=&a,*q=&b;

fun(p,q); printf ("%d,%d\\n",a,b);}

主程序执行后,变量及其值如图5(a)所示,实参指针p指向变量a,实参指针q指向变量b。调用函数fun后,分配的变量及其值如图5(b)所示,此时形参从实参处获得对应的值,其中形参指针p指向主调函数中的变量a,实参指针q指向主调函数中的变量b。

函数fun中的*p和*q交换,就是主调函数中的变量a和b的交换,交换结果如图6(a)所示,主调函数中的变量a和b完成了交换。函数fun调用结束后,释放其所申请的局部变量,结果如图6(b)所示。

通过指针形参可以改变其指向变量的值,变量可以是主调函数中变量,但这些变量并不是实参指针变量,实参的值没有发生改变。所以通过指针形参可以改变其指向变量的值并不违背参数的单向传递规律。

3.3 数组名作为函数的参数

数组名是地址常量,代表函数的起始地址,即数组名是指针类型常量,指向了数组的起始位置。按照参数的类型一致原则,形参就应该为指针类型变量,该变量得到实参的传递后,指针指向数组的起始位置。

故数组名作为函数的参数本质是指针作参数的情形,实际上就是图5(a),(b)描述的情形。形参指针的变化不会改变数组的初始位置,不会改变数组名地址常量,指针参数之间的传递遵循单向的值传递规律。形参指针指向的变量就是数组的内存单元,通过形参指针指向的变量的改变可以达到改变数组元素值的目标。

4 结 语

C语言函数参数的传递规律是单向的传递规律,不论参数是否是指针,主调函数的实参是不会改变的。能够改变的只能是指针指向的变量的改变,在数组中把这种指针指向的变量的特性称为共享内存单元。指针指向的变量并不是作为实数的变量,而是其他的变量,实参也指向该变量,指向变量的改变并等价于实参的改变,地址传递并不违背“值传递”规律。

以局部变量的概念为基石,采用内存图示分析方法,是分析和研究参数传递问题的一种新思路、新方法。

参 考 文 献

[1]古丽孜拉・安尼瓦尔.C语言函数参数传递的几个问题[J].伊犁师范学院学报,2004(3):7374.

[2]吴丽贤.C语言中多维数组指针和递归的教学实践[J].电脑知识与技术:学术交流,2007(2):462,464.

[3]张艳华.C语言函数形参与实参之间的数据传递[J].内江科技,2007(9):80.

[4][美] Herbert Schildt.最新C语言精华\.3版.王子恢,译.北京:电子工业出版社,1997.

[5]谭浩强.C程序设计\.3版.北京:清华大学出版社,2005.

[6]杨战海,郭协潮.基于C语言函数调用获得结果的分析研究\.现代电子技术,2007,30(4):102103.

作者简介 杨战海 男,1972出生,陕西泾阳人,讲师。主要从事计算机算法和数据库技术方面的研究。

上一篇:基于DSP/BIOS设备驱动模型的视频驱动程序开发 下一篇:用于嵌入式计算机性能评测技术及其方法研究