第6章 函 数
学习和解题要点
1.函数的概念和作用
在 C 程序设计中,为了能完成某种特定的功能,并且能适应不同的被加工数据,返回不同的结果,通常都用函数的形式来设计程序。一个较大的问题(程序),一般都被分解成若干个功能来完成,每个功能即一个函数--程序模块,这也是结构化程序设计的思想。
在 C 语言中一般函数可写成:
〈数据类型〉 〈函数名〉( 〈形参1〉, 〈形参2〉, .....)
{ ........
........
return(〈返回值〉);
}
在某个地方要用函数时,可调用函数:〈函数名〉(〈实参1〉, 〈实参2〉, .....)
因此,函数可比仿成一个加工器(黑盒):
加工
加工 ( 函数 )
来料说明 ( 形参 )
产品 ( 函数返回值 )
比如函数是磨粉机,形参相当于来料说明,如可加工五谷,函数值是加工结果,如
磨成的粉。调用函数即开始使用磨粉机,实参用具体的大米,返回大米粉。实参用
小麦,返回面粉等等。
2.函数的定义
存储类型 (返回的)数据类型 函数名(形参说明语句序列) (注:此地分不能有分号)
{
函数内用的变量说明序列;(临时工作单元)
可执行语句序列;(包括 return(表达式)语句)
}
函数的返回值一般是通过 return 语句获得的。
返回的数据类型说明一般应该和return语句中的表达式类型一致,若不一致则以数据类型说明为准。如函数中没有 return 语句或 return;函数无返回值,返回一个用户很难确定的值。
说明:函数的数据类型:int char short long float double *类型。
缺省为 int型。
不返回值为 void型。
函数的存储类型:内部函数 本文件内有效 static
外部函数 可被其他文件函数调用 extern
3.函数调用: 函数名(实参表)
可以为独立语句: 函数名(实参表); 表达式中: 变量=函数名(实参表)+其他式;
实参表与形参表的对应一般要做到三个一致:
个数一致
类型一致(在学指针时,指针变量和地址对应)
次序一致
实参都应该己预先说明的,并有确定的值。
一般,函数都应先定义后调用。对函数返回值是 int 或 char 的可先调用后定义。
如果非int 或 char型的函数一定要先调用后定义,则在函数调用语句前先作一个“申明”, 申明的方法是相当于把函数头部抄一遍,加一个分号:
存储类型 (返回的)数据类型 函数名(形参表);(注:此地分号不可少)
4.函数调用的数据传递
把实参数据复制给形参,形参变量内数据变化不影响实参 --值调用。
x 45y 50b 50
x 45
y 50
b 50
a 45
main()
{ int a=45,b=50;
c=max(a,b);
}
int max(int x,int y)
{ .............}
把实参的地址传给形参,这时形参变量应为指针变量,因此形参实参共用一个内存
位置,形参值的变化也即实参值的变化 --地址调用(名调用)。
xa
x
a
y
80
50
b
temp
50
main()
{ int a=50,b=80;
swap(&a,&b);
}
void swap(int *x,int *y)
{ int temp;
temp=*x; *x=*y; *y=temp;
}
这种方法可使函数除 return 返回值外,还可通过形参返回值。
数组与函数
指定的个别数组元素作实参时,是值调用。
在 C 语言中,由于数组名作为地址,因此实参和变参在以下四种情况时都为
地址调用: 实参和形参都用数组名
实参用数组名,形