已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言函数调用与参数传递剖析摘要:在介绍函数调用有关概念的基础上,通过例证的方法总结了函数调用过程中参数传递的方式及特点,可以更好的帮助学生理解和学习有关函数问题。关键词:函数调用 实际参数 形式参数 参数传递中图分类号:tp312.1 文献标识码:a 文章编号:1007-9416(2012)02-0144-02函数是c语言中的基本组成单位,一个较大的c程序一般可分为若干个程序模块,实现某一特定功能的模块主要由函数来完成。所以,学习c语言程序设计要善于利用函数,一来可以减少重复编写程序段的工作量,二来可以方便的实现模块化程序设计。但是笔者在实际的教学过程中发现,学生在学习函数这部分知识时显的比较吃力。因为在具体使用函数时,要涉及到函数参数传递问题,而参数类型多种多样,使学生对函数问题产生了很多疑惑,根据教学实际,笔者对函数调用与参数传递问题进行了总结,以便大家对函数问题的理解。1、主调函数与被调函数计算机在执行c程序时总是从main函数开始,如果遇到要调用某个函数,则主函数称为主调函数,被调用者称为被调函数。一个c程序可由一个main函数和若干个其他函数构成,main函数用来解决整个问题,它调用解决小问题的其他函数,其他函数也可以相互调用。调用者就是主调函数,被调者就是被调函数,应当注意,main函数只能由系统调用。2、实际参数与形式参数在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中进行函数调用时,函数名后面括弧中的参数称为实际参数,简称实参。在定义函数时函数名后面括弧中的变量名就是形式参数,简称形参。即实参出现在函数调用中,形参出现在函数定义中。主调函数通过函数调用将实参中的数据传递给被调函数的形参,从而实现函数间的数据传递。另外实参与形参进行数据传递时,系统要求实参与形参在数量、类型、顺序应严格保持一致,这一点在使用上要特别注意。3、变量存储类型与作用域主调函数和被调函数数据传递往往要通过变量进行,不同的变量类型影响数据的处理结果。c语言中变量按存储时分配的空间不同可以分为自动变量,寄存器变量,静态变量和外部变量。按变量的生命周期可以分为局部变量和全局变量,局部变量是在一个函数内部定义的变量,在存储器的动态存储区进行分配空间,作用域只在本函数内部有效,比如在主函数里定义的自动变量,寄存器变量,函数中的形式参数等都属于局部变量,在函数调用时,系统才为其分配存储空间,函数调用结束后,空间释放。而对于静态型局部变量是程序编译时由系统在存储器的静态存储区为其分配存储空间,函数调用结束后,空间不释放,其值要保留到程序退出。全局变量是在程序整个运行期间都要占用内存,所以它是全程有效,贯穿于主调函数与被调函数全过程,其值也要保留到程序退出为止。4、参数传递的本质与属性函数参数传递的过程,本质上是一种赋值过程即值传递过程,在调用函数之前,函数的每个实际参数将被复制,复制的值代替对应的形式参数。所以形参实际上得到的不是实参本身,而是实参的值或者实参所代表的值。因此,如果一个变量传递给一个函数,这个变量在调用环境中所存储的值并不会被函数修改,所以形参的值不会反过来影响实参,即实参与形参值传递是单向性的。这两个问题是学习和理解函数参数传递的根本,很多学习c语言的人对这两个问题不是很理解,下面举例说明函数调用时参数传递过程。4.1 数值传递当变量为普通变量时,函数实参可以是自动局部变量,静态局部变量,数组元素,寄存器变量,结构体变量,结构体变量成员,常量等形式,函数形参为对应类型的变量,调用函数时,由系统给形参分配存储单元,存放从实参复制过来的数值。函数调用结束后,形参存储单元释放。例题1:#include void func1(int x)+x;printf (“%d”,x);int main()int n=10;func1(n);printf (“%d”,n);return 0 ;例题1中main函数调用func1函数时,把实参n的值10(注意不是n)传给了形参x,x在func1函数中进行增1运算, 这时x的值发生了改变,但该值不能返回到实参n中,因为x是func1函数内部定义的变量,属于局部变量,调用函数时,系统为x变量在存储器的动态存储区分配存储空间,函数调用结束后,x变量被释放,数值被清,故n值不变,体现了传值的单向性。4.2 地址值传递地址值传递是指实参与形参之间传递的数据是地址,与数值传递不同的是,地址值传递的是形参接收实参地址的复制值,而不是实参值本身。另外,地址值传递方式中系统不为形式参数变量分配存储空间,这一点也与数值传递方式不同。因为函数调用完成数据传递后,实参与形参拥有相同的变量地址,它们指向同一变量单元,该变量在主调函数定义时已经分配了存储空间,形参只是接收了它的一个地址值,并没有接收变量本身。根据参数类型的不同,地址值传递方式常见的有如下几种情况。4.2.1 实参为变量地址,形参为指针例题2:#include void func2( int *x,int *y)x=y;int main() int a=2,b=3;func2(&a,&b);printf (“%d,%d”,a,b);return 0;例题2中在主调函数中将a,b的地址值传给了形参指针x和y,在被调函数中将y值赋给了x,这时x的值发生了改变,x存放的是y的存储地址,即x指向3,但是这个指向并不能返回到主调函数。因为这个地址值在函数调用结束后被释放,其值消失。当然,如果想在被调函数中修改主调函数中实参变量的值,需要修改指针变量x和y所指向的地址中的内容。比如将x=y改为*x=*y,即可达到修改实参变量的目的,但是必须清楚,虽然被调函数通过指针可以修改主调函数中的值,但这只是一种间接访问数据的形式而已,实参向形参传递数据的单向性是不变的。4.2.2 实参为数组名,形参为指针在c语言中,数组名是一个地址,而且是一个地址常量,它代表的是该数组元素的首地址,不是一个变量。当使用数组名作为实参时,实参的值就是数组的首地址,形参指针接收的也是该数组的首地址,被调函数通过形参指针的变化来访问主调函数中数据。例题3:#include void func3( int *x,int y) int i;for(i=0;ivoid func4(int b5)b0=5;b1=4;b2=3;b3=2;b4=1;int main( )int i;int a5=1,2,3,4,5;func4(a);for(i=0;i5;i+)printf(“%4d”,ai);return 0;例题中实参与形参均为数组名,调用函数时,实参数组的首地址复制后给了形参数组,使形参数组名指向了实参数组,当改变形参数组元素值时,实参元素值必然改变,因为实参数组和形参数组是同一块存储单元。4.2.4 实参为指针,形参为数组名4.2.5 实参为指针,形参为指针对于(1),(5)这两种情况比较好理解,实参为指针,其值为地
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC 8803:2025 EN Information technology - 3D Printing and scanning - Accuracy and precision evaluation process for modelling from 3D scanned data
- GB/T 46289-2025褐煤宏观岩石类型分类
- 2025年建筑工程师面试实战演练试卷含答案
- 中国割毛纱项目投资可行性研究报告
- 中国连续式树脂砂混砂机项目投资可行性研究报告
- 中国皮花球项目投资可行性研究报告
- 连接胶管行业深度研究报告
- 2025年执业药师继续教育考试试题(含答案)-非处方药地应用指导
- 2025年市政工程应对挑战试题及答案
- 中国聚苯乙烯塑料板片项目投资可行性研究报告
- 学堂在线 临床中成药应用 章节测试答案
- 2025版海上风电场基础施工合同
- 四年级道德与法治上册:第十课我们所了解的环境污染 第1课时课件
- 小学生冬季校园安全教育
- 枣庄小区停车场管理办法
- 二中初高中贯通班数学试卷
- 2025年中国光敏药物行业市场前景预测及投资价值评估分析报告
- T/CECS 10400-2024固废基胶凝材料
- T/YNIA 002-2021生物降解非织造材料
- 5.《语文综合实践:点亮古籍之光+传承中华文脉》高二语文下学期同步课堂教学设计(高教版2023拓展模块上册)
- 全球及中国核药(核素药物)行业发展动态与需求前景分析报告2025-2030年
评论
0/150
提交评论