C学习-基础:函数
函数形式
类型标识符 函数名(形式参数表){
说明部分语句
}
类型标识符:若不说明类型,默认按整型处理;
形参:是被初始化的内部变量,寿命和可见性仅限于函数内部。
说明部分语句:要执行的语句。“空函数”是指 没有说明部分语句,形如:函数类型 函数名( ){ }
函数(原型)声明
类型标识符 被调用函数名(含类型声明的形参表);
-
函数在使用前必须先声明。函数声明称为函数原型说明。
-
对于库函数,在 #include “ xxx.h”的文件中已包括了函数的原型说明,C的库文件(“xxx.c”)中则包含了函数实现的代码。因此可直接调用
函数的声明定义了:
-
函数的名字
-
函数参数的个数和类型,参数名字可有可无
-
函数返回值的类型
如:double fun1(double,int n1);
函数声明的位置:
-
在主调函数中使用前声明原型
-
在所有函数之前声明原型
-
如果被调用函数的定义出现在主调函数之前,可以不必加以说明。
函数的调用
函数的调用形式
函数名(实参);
函数调用过程中的数据传递
-
形参:系统在其函数被调用时为其分配内存
-
实参:可以是常量、变量和表达式
-
单向值传递:实参 --> 形参
函数调用应遵守的规则:
-
形参和实参 数量一一对应
-
形参和实参 类型一一对应
-
形参和实参 位置一一对应
如果主调函数参数(即实参)与被调函数参数(即形参)类型不匹配,则主调函数参数(实参)转变为被调函数的参数(形参)类型。
各个实参在传值给形参时是根据在表中的位置(而不是名字)结合
函数的返回值
-
通过 return 语句返回。
-
return 语句只能把一个返回值传递给调用函数。
-
返回值的类型为定义的函数类型,若 return 语句中表达式类型与函数类型不一致,则转换为函数类型。
-
返回值可以是数值,也可以是地址。当返回值是地址时,应该用指针接受它(后述)
-
无返回值的函数,定义为 void 类型。
数组作为函数参数
-
数组元素作参数,与单个变量一样。
-
数组名作参数,传送的是数组首地址。形、实参数都可以是数组名,类型要一样,
-
函数原型应该体现参数是一个数组,故用空[ ]表示数组。
-
在C语言中并不给形参数组分配实际的空间,所以在函数中就没必要知道数组的大小。数组大小只在实参数组定义中明确(为了申请内存空间)。
-
C编译系统对形参数组大小不作检查,只是将实参数组的首地址传给形参数组,所以形参数组可以不指定大小,但为了在被调用函数中处理数组元素的需要,可以另设一个参数,用以传递数组元素的个数。如下:
void ClearIntArray(int array[ ], int n) { int i; for( i = 0; i<n; i++) array[i] = 0; }
例子(数组作为函数参数):已知某学生5门课程的成绩,求平均成绩
#include <stdio.h> float aver(float a[]); // 函数原型声明 int main(int argc, char const *argv[]) { int waitag; float score[5], av; int i; printf("Input 5 scores:\n"); for (i = 0; i < 5; i++) scanf("%f", &score[i]); av = aver(score); /* 调用函数,实参为数组名 */ printf("average score is %8.3f\n", av); scanf("%d", &waitag); return 0; } float aver(float a[]) //被调函数 { int i; float av, sum = 0; for (i = 0; i < 5; i++) sum += a[i]; av = sum / 5; return av; }
运行结果
Input 5 scores: 50 45 55 60 40 average score is 50.000
共 0 条评论