浅析C语言中函数的参数传递方式

来源 :硅谷 | 被引量 : 0次 | 上传用户:liuw_ei
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  [摘 要]函数是C程序基本构造模块,是构造结构化程序的基础。对C函数的调用做全面的分析和研究,总结主调函数调用被调函数时的数据传递有值传递方式、地址传递方式以及值传递和地址传递并存方式,并对每一种调用方式的调用过程从内存分配给予说明和解释。
  [关键词]函数形参 函数实参 值传递 地址传递 单向 双向
  中图分类号:TP311.11 文献标识码:A 文章编号:1671-7597(2008)1010068-01
  
  一、引言
  
  C语言程序是由函数组成的,函数是程序的基本单位。设计C程序时,通常将一个大的程序按功能分成若干个较小的模块,每个模块编写成结构清晰、接口简单、容易理解的程序函数。并且这种方法就叫模块化程序设计方法,而在划分模块时要求模块的“内聚性”强,与其他模块的“耦合性”弱,所以一般要求把C程序中的函数做成一个封闭体,函数之间的联系渠道主要由函数的参数承担。因此在C程序设计中函数的参数是不容忽视的角色。
  
  二、函数的参数
  
  在C程序中,函数之间存在调用与被调用的关系,当被调函数是有参函数时,主调函数和被调函数间通过参数有数据传递关系。函数的参数有形参和实参之分,定义函数时的参数称为形式参数,简称形参。形参在该函数未被调用时没有确定的值,只是形式上的参数,常用变量表示;调用函数时的参数称为实参,实参可以是变量、常量或表达式,有确定的值,是实实在在的参数。函数定义时的形参不占内存,只有发生调用时,形参才被分配内存单元,接受实参传来的值。
  函数的形参与实参个数要求相等,对应类型一致,且顺序相同。形参和实参可以同名,形参是局部于该函数的变量,即使形参和实参同名,也是两个不同的变量,占不同的内存单元,因此形参也需要类型说明,函数可不带参数,也可以带多个参数,当有多个参数时,每个参数之间用逗号分隔。例如:
  float max(float a,float b)
  {……}
  main()
  {float x,y;
  ……
  max(x,y);}
  以上a、b是形参,x、y是实参。在程序执行时,形参与实参之间存在着数据传递的关系。
  为了论述函数的参数传递方式,先看一个简单的程序。调用交换两数的函数 swap( ),观察程序的运行结果。
  #include
  void swap(int a,int b)
  {int t;
   t=a;a=b;b=t;
   printf(“调用中:a=%d ,b=%d\n”,a,b);}
  main( )
  {int a=1,b=2;
   printf(“调用前:a=%d,b=%d\n”,a,b);
  swap(a,b );
  printf(“调用后:a=%d,b=%d\n”,a,b);}
  程序运行的结果是:调用前:a=1,b=2
  调用中:a=2,b=1
  调用后:a=1,b=2
  运行结果表明,尽管形参a、b在 swap( )函数中交换了,但主函数main( )在调用swap( )的前后,实参a、b的值都没有改变。那么,为什么形参a、b的交换,并不影响实参a、b的值,实参与形参之间的数据到底是如何传递的呢?这是由参数的单向值传递方式决定的。
  三、参数的“值传递”方式
  在c中,参数的值传递具有如下特点:(1)实参与形参各自占据独立的存储单元。(2)调用时,将实参的值传入形参单元。(3)在被调用的函数内,访问相应的形参单元。ⅳ)函数调用结束后,释放形参单元。
  因此,在被调用函数中改变形参的值不会改变实参的值。函数调用时,是把实参的值拷贝到相应的形参中去,这样,被调用函数得到的是实参的拷贝,而不是实参本身。例如上例中调用函数swap( )时,函数参数传递过程可用图1形象地表示出来。
  
  方框表示一个特定的存储单元,箭头表示将一个存储单元的值复制到另一个存储单元中。
  由于一个数组元素相当于一个同类型的变量,即在c语言中,简单变量或数组元素作为函数参数都是按“值传递”方式处理的,数据传递是单向的,即只能把实参的值传递给形参,而不能将形参的值传递给实参,形参值的改变
  不影响实参。
  
  四、参数的“地址传递”方式
  
  从上例中可以看出,由于以简单变量作为函数的形参和实参时是“值传递”,且是“单向”的,也就是说,对被调用函数来说,参数值只能“传入”不能“传出”。其实这只是表面现象,实际上实因为形实参分别对应于不同的存储单元。
  如果将程序修改为用指针变量作为函数的形参,以变量的地址作为实参来调用swap( )函数,情况就不一样了。程序修改如下:
  #include
  void swap(int *x,int *y)
  {int t;
   t=*x;*x=*y;*y=t;}
  main( )
  {int a=1,b=2;
   printf(“调用前:a=%d,b=%d\n”,a,b);
  swap( &a,&b);
  printf(“调用后:a=%d,b=%d\n”,a,b);}
  程序运行的结果是:调用前:a=1,b=2
  调用后:a=2,b=1
  从输出结果看出,实现了a,b的交换。原因是指针作为函数参数,形参 x,y不再是简单变量而是指针变量,实参是变量a,b的地址,即传递的是变量a,b的地址&a,&b,而不再是a,b的值。换句话说,采用的不是“值传递”方式,而是“地址传递”参数传递如图2所示。
  
  图2(c)中的存储单元中有两个值,斜线前是交换前的值,斜线后是交换后的值,从图中可以清楚地看出,本程序中的swap( )函数通过指针间接访问了实参a、b,即swap( )函数中实际交换的是实参a、b的值。
  C 语言中还可以使用数组名作为函数参数,在函数间传递数据。我们知道数组在内存中占有一段连续空间,这块空间有一个首地址,数组名不但代表数组元素的共同名字,而且代表数组的首地址,即数组中第一个元素的地址。所以,数组名作为参数传递时,传给形参的是实参数组的首地址,从而使形参数组与实参数组共用同一段内存空间,形参数组元素的值发生变化使,即实参数组元素的值发生变化。比如甲、乙二人住同一宿舍,如果甲的
  宿舍重新装修,那么乙的宿舍也被重新装修。从而认为“地址传递”的方式是“双向”的。
  
  五、“值传递”和“地址传递”方式并存
  
  一般情况下,函数调用时参数的“值传递”和“地址传递”方式并存,如以下程序:
  main()
  {int a[10],i;
   for(i=0;i<10;i++)scanf(“%d”,&a[i]);
  sort(a,10);
  for(i=0;i<10;i++)printf(“%d ”,a[i]);}
  Sort(int x[],int n)
  {int i,j,k,t;
  for(i=0;i   {k=i;
   for(j=i+1;jx[k])k=j;
   if(k!=i){t=x[i];x[i]=x[k];x[k]=t;}}}
  此时数组a 与数组x之间是“地址传递”方式,10与n之间是“值传递”方式。
  
  六、结束语
  
  通过以上分析,可以看出当参数是一般普通变量或数组元素时,函数间采用的是“值传递”方式,传递的是内存单元里的内容。当参数是指针变量或数组名时,函数间采用的是“地址传递”方式,传递的是内存单元的地址,实质上就是共享了内存。
  
  参考文献:
  [1][美]Herbert Schildt.最新C语言精华[M].3版.王子恢译.北京:电子工业出版社,1997.
  [2]谭浩强.C程序设计[M].2 版.北京:清华大学出版社,1999.
  [3]田淑清.C语言程序设计[M].北京:高等教育出版社,2005.
  
  作者简介:
  贺爱香,女,安徽省宿松县人,助教,学士,研究方向为计算机应用。
  
  注:“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”
其他文献
[摘要]为研究低成本的导电银浆天线性能,以超高频RFID标签天线为例,采用高效且环保的丝网印刷工艺制作了一款S形振子天线,并着重分析了其阻抗、回波损耗特性。通过软件仿真和实物测量结果对比发现,两者数据吻合良好,且性能符合标签天线的工程应用要求。这也表明,导电银浆可用于低成本的天线制造。  [关键词]射频识别 导电银浆 S形振子天线 标签天线   中图分类号:TN821.4 文献标识码:A 文章编号
期刊
[摘要]随着计算机和网络技术的迅速发展,基于Web的数据库应用越来越广,同时给数据库的维护和管理带来了很多安全问题。为提高Web应用程序中的数据库安全性,从构建系统体系模型,建立登入机制,进行存储访问控制,审计追踪,数据库备份与恢复,使用视图机制和数据加密技术等方面分析了基于Web的数据库应用系统的设计。  [关键词]Web应用程序 数据库 安全 分析与设计  中图分类号:TP3 文献标识码:A
期刊
[摘要]介绍一种基于图形化虚拟仪器编程软件LabVIEW的高速数据采集系统设计方案。系统以NI公司的高速数据采集卡PCI-488 为硬件平台,通过LabVIEW软件对数字源表的实时测试采集数据,并将数据存储到文本文件中。测试结果表明,该系统能够有效地完成对信号的高速数据采集和实时测试和图形显示。  [关键词]LabVIEW软件平台 PCI-488卡 数字源表(SourceMeter)  中图分类号
期刊
[摘要]svchost.exe是nt核心系统的非常重要的进程,对于2000、xp来说,不可或缺。很多病毒、木马也会调用它。Svchost本身只是作为服务宿主,并不实现任何服务功能,需要Svchost启动的服务以动态链接库形式实现。  [关键词]svchost.exe 进程 病毒  中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2008)1010070-01    电脑启动后弹出
期刊
[摘要]从当今通信技术发展趋势出发,通过应用MATLAB仿真软件,对影响信号谱估计的四个参数作了定性研究,并比较它们之间的异同。  [关键词]信号谱估计仿真MATLAB   中图分类号:TN91 文献标识码:A 文章编号:1671-7597(2008)1010061-02    一、引言  近代谱估计方法已广泛应用于各个领域,如气象预报、市场预测、语声处理、图像加工、地震信号分析、地质勘探、信号识
期刊
[摘要]如何利用现代化的计算机技术和网络技术,为高校党务工作者提供一种高效率、手续简便的服务,以及更好地管理大量的高校学生党员,是高校党务管理部门面临的新课题。针对昆明冶金高等专科学校学生党员发展的业务流程和管理需求,应用统一建模语言UML进行分析。  [关键词]高校学生党员管理 信息系统 统一建模语言  中图分类号:G47 文献标识码:A 文章编号:1671-7597(2008)1010072-
期刊
[摘要]针对混沌系统中Lyapunov指数的估计问题,从受控角度出发,提出一种Lyapunov指数新的估计方法。得知只要离散系统中的向量场函数 f(x)对应的雅克比矩阵fx(x)满足一定的条件,就能得到系统Lyapunov指数的上界和下界。分析表明,该估计方法具有可计算性,而且容易操作。  [关键词]Lyapunov指数 特征值 奇异值  中图分类号:O13 文献标识码:A 文章编号:1671-7
期刊
[摘要]根据飞机概念设计系统同其他CAD/CAM系统通过IGES标准进行数据交换遇到的问题为例,介绍IGES图形交换标准的重要性,总结在飞机设计CAD/CAM系统中应用IGES标准传输图形数据时需要注意的问题和解决方法,满足飞机设计在研制过程中使用CAD/CAM时数据传输的需要。此外还分析在IGES标准基础上发展起来的STEP标准出现的原因及其应用前景。  [关键词]CAD/CAM IGES 飞机
期刊
[摘要]随着国家教育信息化工程的全面推进,高校的校园教育管理信息化系统之间需要实现数据共享和互访,使教育部门内部各应用软件之间实现互操作;使互操作过程与操作系统无关、与传输协议无关、与程序语言无关。   [关键词]ZIS EMIF 教育管理信息系统 互操作 教育管理信息化  中图分类号:C94 文献标识码:A 文章编号:1671-7597(2008)1010059-02    教育管理信息系统互操
期刊
[摘要]介绍基于B/S结构开发学校公寓信息管理系统的设计构想和实现方法,中给出系统的模块设计和数据库的表格设计,还有软件实现部分的通用代码分析以及关键技术的分析。  [关键词]公寓信息管理 B/S 网络数据库 .NET  中图分类号:TP2 文献标识码:A 文章编号:1671-7597(2008)1010071-01    一、引言    随着我国高等教育的飞速发展,高校的办学规模迅速扩大,在校人
期刊