摘要:C语言的模块设计主要是通过函数实现的,函数间信息的传递主要是通过参数实现的。函数的参数传递包括传值和传址。为了区别两种传递方式的不同,采用实例和图示两种方法,列举了变量、数组名、指针作参数的实例,通过比较函数调用后形参和实参的变化,总结出函数调用时参数传递的两种规律,即基类型变量、数组元素、结构体变量作参数时是传值,也就是单向的值传递;数组名、指针作参数时是传址,也就是共享同一个地址。

关键词:传值; 传址; C语言函数; 地址共享

中图分类号:TN91134; TP311文献标识码:A文章编号:1004373X(2012)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

收稿日期:20110926在程序设计中常采用模块设计方法,实际上所谓模块设计的思想是一种“分而治之”的思想,把一个大任务分为若干个子任务,这样每一个子任务就相对简单了。程序中的子任务在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].北京:清华大学出版社,2005.

[2]杨战海,薛苏秦,张晓光.基于C语言函数参数传递规律的探讨[J].现代电子技术,2008,31(16):8991.

[3]马新.C语言函数间参数传递机制的探讨[J].白城师范学院学报,2008(6):2627.

[4]王英存.C语言教学中函数参数传递难点探讨[J].中国商界,2010(9):258259.

[5]李寅杰.C语言函数中的三类形参[J].辽宁师专学报:自然科学版,2007(3):5254.

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

[7]张筱红,李军宇,高喜民.C语言函数形参与实参之间的数据传递[J].平顶山工学院学报,2002(3):5152.

[8]王晓青.C语言函数调用时的参数变化[J].青海大学学报:自然科学版,1998(1):5558.

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

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

函数c语言如何传参数,C语言函数参数传递规律相关推荐

  1. c语言中 调用函数除函数名外,【单选题】在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分) A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值...

    [单选题]在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分) A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值 更多相关问题 下列关于IMOECDIS性能标 ...

  2. c语言fgetpos的参数,C语言fgetpos()函数:获得当前文件的读写指针(转)

    头文件:#include fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中.pos以内部格式存储,仅由fgetpos()和fsetpos()使用.f ...

  3. c python 传参数 数组_python函数传递数组参数吗

    函数是任何一门编程语言都不可缺少的,而且也是非常重要的一部分.Python中函数的参数,可以分为以下几类: 位置参数,有时也称必备参数,指的是必须按照正确的顺序将实际参数传到函数中,换句话说,调用函数 ...

  4. db2自定义函数能返回几个参数_DB2 用户自定义函数

    用户自定义函数 DB2 内部提供了大量的函数,例如求某个字段最大值的 MAX() 函数,求某个日期所在年份的 YEAR() 函数,等等.如果在使用 DB2 的过程中,需要反复使用同一个功能,就可以把这 ...

  5. linux下c语言线程传参数,【linux】C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0...

    C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0 本贴问题,之前已经提问过一次,当时已经解决了,原贴在这里https://segmentfault.com/q/1 ...

  6. java 调用r语言包传参数_Java与R语言的配置,调用

    我是最近才接触到了R语言,所以用起来有很多的问题,之前只是想单纯想用java调用到R语言中的一些东西,没有想到这个事情并不是想象的那么简单的.好了,闲话不多说,下面我来说说我在运用R的时候遇上的问题吧 ...

  7. java给r语言传参数_R语言的传参

    越南式三明治 1. mac或linux: 脚本第一行加:#!/usr/bin/Rscript 2. commandArgs()传参: 测试脚本test.R:args print(args[1]) pr ...

  8. C语言函数最多有有多少个参数,C中子函数最多有几个形参

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C89 31个,C99 127个. ANSI C89 2.2.4.1 Translation limits The implementation shal ...

  9. c语言中函数可以有几个参数,C中子函数最多有几个形参

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C89 31个,C99 127个. ANSI C89 2.2.4.1 Translation limits The implementation shal ...

  10. c 和易语言如何传字节集,易语言文本型和字节集型数据相互转换的工具

    文本和字节集数据互相转换的代码 .版本 2 .程序集 窗口程序集1 .子程序 文本到字节集, 文本型, 公开 .参数 要转换的文本, 文本型 .局部变量 字节集变量, 字节集 .局部变量 循环次数, ...

最新文章

  1. 红旗Linux认证简介
  2. Mac写文件到U盘的方法
  3. FPGA跨时钟域处理的三大方法
  4. react中context到底是如何传递的-源码分析
  5. python 快速排序
  6. sap 常用事务代码
  7. ubuntu 14.04 安装qq 2015
  8. SAP Spartacus Popover Directive 构造函数的用途分析
  9. Leetcode——300. 最长上升子序列
  10. endpointimpl怎么填参数_App拉新:以老拉新活动怎么做?
  11. Ccover在hudson持续集成中的应用
  12. 员工工号怎么编码_人事档案编码怎么编
  13. 截止失真放大电路_数字电路基础(一)
  14. xp如何删除计算机管理员用户账户,“WINXP系统除Administrator以外只有一个管理员账户时,此帐户默认无法删除,如何删除”的解决方案...
  15. 商场抽奖软件 android,召唤抽奖系统
  16. oracle编程题考试题,oracle考试题
  17. Java学习日记1——基础认知
  18. HDU - 6344 2018百度之星资格赛 1001调查问卷(状压dp)
  19. 将现有android项目打包成aar包供第三方应用调用
  20. ffmpeg实现视频和音频分离,并且将声音切片

热门文章

  1. 如何利用python中的pandas模块计算环比和同比
  2. python用tkinter做简易计算器实验报告_Python Tkinter实现简易计算器功能
  3. 家用带宽-路由器的选择
  4. python zip压缩_用Python处理ZIP压缩包
  5. jquery设置禁止浏览器刷新
  6. moment.js时间格式转换
  7. css鼠标移入变小手
  8. 用英雄联盟的方式讲解 JavaScript 设计模式
  9. C++多线程03 Lambda表达式与caII once
  10. 卫星定位领域相关基础知识汇总