C语言程序设计A课程辅导(6)
---第6章: 函数
主要内容:
一、函数的定义
二、函数的调用
三、变量的作用域
四、递归函数
五、函数指针
六、函数应用举例
一、函数的定义
函数定义格式
[] ()
有效范围:由所使用的保留字extern或static决定,若使用extern则称为全局函数或外部函数;若使用static则称为局部函数或静态函数。若选项被省略,则默认为是全局函数。对于全局函数,能够在一个程序的其他每个程序文件中被声明和调用;对于局部函数,则只能被所在的程序文件声明和调用。
类型名:给出函数通过return语句返回的值的类型,当使用保留字void作为类型名时,则不需要返回值。
函数名:是用户为函数所起的名字,它是一个符合C语言命名规定的标识符。通常用函数名反映该函数的功能。如用SUM表示求和。
参数表:又称形式参数表,它包含有任意多个参数说明,当多于一个时其前后两个参数说明项之间必须用逗号分开。每个参数说明包括类型名和参数名两项内容。
函数体:是一条复合语句,它以左花括号开始,到右花括号结束,中间为一条或若干条C语句。
函数头:在函数定义中,函数体之前的部分构成函数头,又称为函数原型。取出函数头再加上分号就构成该函数的原型声明语句。
函数定义格式举例
(1) void f1() {...} //返回无类型,无须返回值,函数名为f1
//参数表为空,即不带有任何参数。
(2) static void f2(int x) {...} //文件域函数,无返回类型,函数名
//为f2,带有一个int型参数x
(3) int f3(int x,int* p) {...} //全局域函数,返回值类型为int,
//函数名为f3,带有2个参数,一个为整型x,另一个为整型指针p
(4) char* f4(char a[]){...} //返回类型为字符指针,函数名为f4,
//带有一个一维字符数组参数a,标记为后跟一对中括号
(5) void f5(float c[][N], int m) {...} //无类型,函数名f5,第
//1个为二维单精度型数组参数c,第2个为整型参数m。
//标记是后跟两对中括号,并在第2个内给出常量(列数)。
函数定义和使用的几点说明
函数定义位置:可以出现在整个程序的任一个程序文件内的任何位置。
函数原型声明语句:在利用函数调用表达式调用一个函数之前,必须出现有该函数的原型声明语句或函数定义。
函数的常量形参:即在一般的形参说明项前加上const修饰。如:
void f6(const float x, float y) {...} //x常量形参,y一般形参
void f7(const char* a, char* b) {...} //a常量形参,b一般形参
在f6函数体中只能读取x的值,不能改变它的值,对y可任意操作。
在f7函数体中只能读取a所指的字符或字符串,不能改变它,对b任意。
一维数组参数说明项的格式: []
等价于指针参数说明: *
指针变量名就是数组参数说明中的数组名。如一个函数定义中的数组参数说明
int a[] //数组参数说明,指向int类型元素的指针
int* a //等价于指针参数说明
当调用它们时,对应的实参为同类型的数组名,访问它们既可以是指针方式也可以是下标方式。
二维数组参数说明项格式: [][]
等价的指针参数说明: (*)[]
如假定一个函数定义中的:
二维数组参数说明: float c[][N] //指向N个float类型元素的指针
等价的指针参数说明: float(*c)[N]
当调用它们时,与c对应的实参为具有相同列数N的二维数组名,访问它们既可以是指针方式也可以是下标方式。
编写具体函数定义举例
例1:编写一个函数定义,求3个整数中的最大值。
int MaxValue(int x, int y, int z) //用x,y,z分别表示3个整数形参
{
int w;