一个较大的程序一般分为很多个程序模块,每个程序模块实现一个特定的功能。所有高级语言中都有子程序这个概念,用子程序实现模块的功能,而C语言中的子程序是用函数来完成的。
- 一个C程序有一个主函数和很多其他函数组成,主函数可以调用其他函数,其他函数也可以相互调用。而且同一个函数可以被一个或多个函数调用任意次。
- C程序是从main函数开始的,如果是在函数中调用其他函数,调用后流程返回到main函数,在main函数中结束程序的运行。
- 所有的函数都是平行的,相互独立,不存在谁属于谁,在c语言中函数是不能嵌套定义的。
- 从我们使用的角度看,函数分为两种,一种是标准函数,由系统提供的,使用时不用定义,可以直接使用。二是自己定义的,就是自己需要什么样的函数定义什么的函数。
- 从函数的形式来看分为两种,一是无参函数,主调函数不向被调函数传递数据,一般执行一些操作。无参函数可以带回数据可以不带回数据。二是有参函数,主调函数通过参数向被调函数传递数据,执行被调函数是会得到一个值返回到主调函数,供其使用。
函数定义的一般形式
定义无参函数的一般形式:
类型标识符 函数名()
{
声明部分
语句部分
}定义有参函数的一般形式:
类型标识符 函数名(形式参数表列)
{
声明部分
语句部分
}
- 空函数
类型说明符 函数名()
{ }
空函数什么也不做,在主调函数中写上空函数,表明这里要调用一个函数,但现在不起作用,等后来扩充函数功能时将它补上。
函数参数和函数的值
形式函数和实际函数
在定义函数时函数名括号里的变量名叫形参。
在主函数中调用函数时,函数名后面括号中的参数叫实参。
调用时将实参的值赋给形参。单向传递,只由实参传给形参。形参如果发生改变,单实参不会发生改变。
实参与形参个数相等,类型匹配,一个萝卜一个坑的传数据。return语句
return语句可将被调函数带回一个函数值,供主调函数使用。return后面可以是表达式。
在定义函数时指定函数的类型要与return返回值的类型一样,如果不一样以函数值为准,对返回值可自动进行转化。
函数的调用
- 函数调用的一般形式为
函数名(实参表列)
在函数的调用对实参求值时,在C中是按从右到左的顺序求值的。
如 p = f(i, ++i),i=1,如果从做到右算,f(2,3),但按照从右往左顺序,f(3,3)
- 函数调用的方式
1 函数语句
函数调用作为一个语句
2 函数表达式
函数在一个表达式中,要求被掉函数带回来一个值参与表达式的运算,例如:c = 2 * max(a,b);
3 函数参数
函数调用作为一个实参。
m = max(a,max(b,c);
函数的嵌套调用
前面说过c语言不能嵌套定义函数,但可以嵌套调用函数,意思是,在调用一个函数时又调用另外一个函数。
数组作为函数参数
- 数组函数作函数实参
与用变量做实参一样是单向传递,即值传递。 - 数组名做函数参数
(1) 在用数组名做函数参数时,此时形参应用数组名或指针变量。
(2)还应在主调函数和被调函数分别定义数组。
(3)实参数组和形参数组类型应一致。
(4)在c语言中对形参数组大小不做检查,只是将实参数组首元素的地址传给形参数组。也就是说形参数组中各元素的值如发生变化会使实参数组的值同时发生变化,利用这点可以改变实参数组元素的值。