论文部分内容阅读
【摘要】函数是C语言程序设计课程教学的重点和难点,特别是函数调用中参数传递是许多学生难于理解和掌握的知识点。本文结合实例,采用图示方法,深入分析了C函数调用中参数传递的两种方式,并就两种方式下参数的正确使用和注意事项进行了说明,对于理解和掌握C函数调用中的参数传递很有帮助。
【关键词】C语言 函数定义 函数调用 参数传递
【中图分类号】TP312 【文献标识码】A 【文章编号】1009-9646(2008)09(b)-0151-02
1 引言
设计复杂程序,通常采用模块化方法,将大程序分为若干个模块,每个模块实现某个特定功能。几乎所有高级程序设计语言都有子程序概念,用子程序来实现模块的功能。C程序结构非常符合模块化的设计思想,用C函数实现各功能模块,通过函数调用实现复杂程序的全部功能。这就要求C程序员必须掌握C函数的定义和调用形式,特别对函数调用中参数传递有深入理解。本文结合实例,采用图示方法,深入分析C函数调用中参数传递的两种方式,即“传值”和“传址”,对理解和掌握参数传递很有帮助。
2C函数调用参数传递的深入分析
2.1 “传值”方式的深入分析
“传值”是C默认的参数传递方式,对应的实参和形参是两个独立的实体,占用不同的内存单元,调用函数时,系统把实参值复制一份给形参,便断开二者的联系,形参值的改变对实参无影响。因此,“传值”是单向的,只能由实参传递给形参。下面C函数调用采用“传值”方式,分析能否实现两数互换。
执行程序,运行结果:a=10,b=20,并未实现a、b互换。分析参数传递过程如图1所示,由于“传值”方式的实参和形参占用不同的内存单元,当调用函数Swap时,系统把实参a、b的值复制一份给形参x和y,便断开二者的联系,函数Swap交换x与y的值,并不影响实参a和b,最终未能实现a、b互换。
说明:①形参为“传值”方式的简单变量,实参可以是同类型的常量、变量、数组元素或表达式。②形参为“传址”方式,实参是常量或表达式,“传址”无效,相当于“传值”方式。
2.2 “传址”方式的深入分析
“传址”是C语言重要的参数传递方式,应用广泛。函数调用时,系统将实参的地址传递给形参,实参与形参占用不同的存储单元,传递方式是双向的,形参值的改变将影响实参值。下面将讨论“传址”方式的几种情况。
数组名作函数参数。形参与实参均用数组名的情况属“传址”方式。下面C函数调用采用“传址”方式,分析能否实现两数组对应元素值的互换。
执行程序,运行结果:10 1 20 2,实现了a、b两数组值的互换。分析参数传递过程如图2所示,由于“传址”方式的实参和形参占用同一段内存单元,当调用函数Swap时,系统把实参数组a、b的首地址分别传递给形参数组x和y,使得x与a、y与b分属同一段存储单元; 当执行函数Swap时,交换x与y等同于交换a与b;调用结束,返回主调函数,实现a、b两数组对应元素互换。
指针作函数参数。当形参为指针变量时,对应的实参可以是指针变量、数组名或存储单元地址,这种情况属于“传址”方式。分析下面程序能否真正实现两数组对应数据的互换功能。
执行程序,运行结果:10 1 20 2,实现了a、b两数组对应元素互换。参数传递过程与图2相同,因为,在C语言系统中,数组就是采用指针来实现。
2.2.3 结构体作函数参数。结构体作函数参数,有两种情况:①ANSI C新标准允许用结构体变量作函数参数,相当“传值”方式。②指向结构体变量的指针作函数参数,相当“传址”方式。下面程序采用第②种方式,实现两个结构体变量中对应元素值的互换。其参数传递过程与图2相同。
2.2.4 指向函数的指针变量作函数参数。函数在编译时被分配一个入口地址,称为函数指针。可以利用一个指针变量指向函数,并通过该指针变量调用此函数。函数指针变量常用的用途之一就是把指向函数的指针变量作为参数,以实现函数地址的传递,也就是将函数名传给形参,只要在每次调用函数时给出不同的函数名作为实参,即可通过同一个接口函数调用不同的函数。这种方法符合结构化方法的原则,在程序设计中经常使用。举例:设计一个接口函数process,每次调用实现不同的功能。
分析程序的执行,在main函数中每次调用process接口函数时,除了将a和b作为实参传给process函数的形参x、y外,还将函数名max、min或add作为实参将其入口地址传送给process函数中的指针变量fun,然后通过fun调用相应的函数。程序执行过程中变量fun变化示意图如下图3。从本例看出,函数指针变量的使用增加了函数使用的灵活性,可以设计编写一个通用的函数来实现各种专用的功能。
3 结束语
在C程序设计中,函数使得程序简练、高效,便于程序的调试和维护,也是利用C开发应用系统的基础,同时,函数又是C语言教学的重点和难点,学生很难理解和掌握,特别是C函数调用的参数传递机制和正确使用。本文结合实例,采用图示方法,从多方面深入分析了C函数调用过程中参数传递的两种方式。实践证明,图示方法对学生正确理解和掌握C函数调用中的参数传递很有帮助。
参考文献
[1] 谭浩强.C程序设计(第二版).北京:清华大学出版社.1999,210-216.
[2] 杨路明.C语言程序设计教材(第二版).北京:北京邮件大学出版社.2005,180-183.
[3] 李文兵.C应用程序设计技术.北京:清华大学出版社.1994,94-100.
[4] 王小華.C++ BUILDER编程技巧、经验与实例.北京:人民邮电出版社.2004,156-158.
注:“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”
【关键词】C语言 函数定义 函数调用 参数传递
【中图分类号】TP312 【文献标识码】A 【文章编号】1009-9646(2008)09(b)-0151-02
1 引言
设计复杂程序,通常采用模块化方法,将大程序分为若干个模块,每个模块实现某个特定功能。几乎所有高级程序设计语言都有子程序概念,用子程序来实现模块的功能。C程序结构非常符合模块化的设计思想,用C函数实现各功能模块,通过函数调用实现复杂程序的全部功能。这就要求C程序员必须掌握C函数的定义和调用形式,特别对函数调用中参数传递有深入理解。本文结合实例,采用图示方法,深入分析C函数调用中参数传递的两种方式,即“传值”和“传址”,对理解和掌握参数传递很有帮助。
2C函数调用参数传递的深入分析
2.1 “传值”方式的深入分析
“传值”是C默认的参数传递方式,对应的实参和形参是两个独立的实体,占用不同的内存单元,调用函数时,系统把实参值复制一份给形参,便断开二者的联系,形参值的改变对实参无影响。因此,“传值”是单向的,只能由实参传递给形参。下面C函数调用采用“传值”方式,分析能否实现两数互换。
执行程序,运行结果:a=10,b=20,并未实现a、b互换。分析参数传递过程如图1所示,由于“传值”方式的实参和形参占用不同的内存单元,当调用函数Swap时,系统把实参a、b的值复制一份给形参x和y,便断开二者的联系,函数Swap交换x与y的值,并不影响实参a和b,最终未能实现a、b互换。
说明:①形参为“传值”方式的简单变量,实参可以是同类型的常量、变量、数组元素或表达式。②形参为“传址”方式,实参是常量或表达式,“传址”无效,相当于“传值”方式。
2.2 “传址”方式的深入分析
“传址”是C语言重要的参数传递方式,应用广泛。函数调用时,系统将实参的地址传递给形参,实参与形参占用不同的存储单元,传递方式是双向的,形参值的改变将影响实参值。下面将讨论“传址”方式的几种情况。
数组名作函数参数。形参与实参均用数组名的情况属“传址”方式。下面C函数调用采用“传址”方式,分析能否实现两数组对应元素值的互换。
执行程序,运行结果:10 1 20 2,实现了a、b两数组值的互换。分析参数传递过程如图2所示,由于“传址”方式的实参和形参占用同一段内存单元,当调用函数Swap时,系统把实参数组a、b的首地址分别传递给形参数组x和y,使得x与a、y与b分属同一段存储单元; 当执行函数Swap时,交换x与y等同于交换a与b;调用结束,返回主调函数,实现a、b两数组对应元素互换。
指针作函数参数。当形参为指针变量时,对应的实参可以是指针变量、数组名或存储单元地址,这种情况属于“传址”方式。分析下面程序能否真正实现两数组对应数据的互换功能。
执行程序,运行结果:10 1 20 2,实现了a、b两数组对应元素互换。参数传递过程与图2相同,因为,在C语言系统中,数组就是采用指针来实现。
2.2.3 结构体作函数参数。结构体作函数参数,有两种情况:①ANSI C新标准允许用结构体变量作函数参数,相当“传值”方式。②指向结构体变量的指针作函数参数,相当“传址”方式。下面程序采用第②种方式,实现两个结构体变量中对应元素值的互换。其参数传递过程与图2相同。
2.2.4 指向函数的指针变量作函数参数。函数在编译时被分配一个入口地址,称为函数指针。可以利用一个指针变量指向函数,并通过该指针变量调用此函数。函数指针变量常用的用途之一就是把指向函数的指针变量作为参数,以实现函数地址的传递,也就是将函数名传给形参,只要在每次调用函数时给出不同的函数名作为实参,即可通过同一个接口函数调用不同的函数。这种方法符合结构化方法的原则,在程序设计中经常使用。举例:设计一个接口函数process,每次调用实现不同的功能。
分析程序的执行,在main函数中每次调用process接口函数时,除了将a和b作为实参传给process函数的形参x、y外,还将函数名max、min或add作为实参将其入口地址传送给process函数中的指针变量fun,然后通过fun调用相应的函数。程序执行过程中变量fun变化示意图如下图3。从本例看出,函数指针变量的使用增加了函数使用的灵活性,可以设计编写一个通用的函数来实现各种专用的功能。
3 结束语
在C程序设计中,函数使得程序简练、高效,便于程序的调试和维护,也是利用C开发应用系统的基础,同时,函数又是C语言教学的重点和难点,学生很难理解和掌握,特别是C函数调用的参数传递机制和正确使用。本文结合实例,采用图示方法,从多方面深入分析了C函数调用过程中参数传递的两种方式。实践证明,图示方法对学生正确理解和掌握C函数调用中的参数传递很有帮助。
参考文献
[1] 谭浩强.C程序设计(第二版).北京:清华大学出版社.1999,210-216.
[2] 杨路明.C语言程序设计教材(第二版).北京:北京邮件大学出版社.2005,180-183.
[3] 李文兵.C应用程序设计技术.北京:清华大学出版社.1994,94-100.
[4] 王小華.C++ BUILDER编程技巧、经验与实例.北京:人民邮电出版社.2004,156-158.
注:“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”