一:前言
不同于数学中的函数,在c语言中可以理解成子函数,是完成某项特定任务的一小段代码。
C语言程序就是由无数个小的函数组成的。
可以分成两类:库函数和自定义函数。
二:库函数
1:标椎库
C语言标准中规定了库函数的各种语法规则,但不提供库函数,C语言的国际标准ANSIC规定了一些常用的函数的标准,被称为标准库,不同的编译器厂商根据标准给出了一系列函数的实现。这些函数被称为库函数。如:printf,scanf.库函数也是函数,但这些函数可以直接使用,明显提高了效率。
2:头文件
库函数的使用需要头文件的声明。不同的库函数可能需要不同的头文件。
三:自定义函数
1:语法形式:
返回类型+函数名(形式参数)
{函数体
}
函数返回类型可以是空类型,表示什么也不返回。
函数也可以没有参数,即void ,如果有参数,必须明确函数参数的类型和名字,以及参数个数。
2:形参和实参
实参就是实际传递给函数的参数
形参:只是形式上存在,不会向内存申请空间,只有在函数被调用时,为了存放实参传递过来的值,才会向内存申请空间。
3:return语句
1:return后面可以是一个具体的值,也可以是一个表达式,是表达式时,则先计算表达式的结果,再返回表达式的结果。
2:return后面可以什么也没有,适合函数返回类型是空类型的适合,即void。return执行后,后面的代码就不执行了。
3:return后面的返回的值和返回类型不一致时,系统自动将返回的值转换为函数的返回类型。
综上所述:看代码:
4:如果函数中出现if等分支语句,要保证每种情况下都有return返回,否则出现编译错误。如下图:当i!=5时,没有返回值。
正确写法:
4:数组做函数参数
数组传参:
1:函数的形式参数要和数组的实参个数相同
2:函数的实参是数组,形参也必须是数组
3:形参如果是一维数组,数组大小可以省略
4:形参如果是二维数组,行可以省略,列不可以
5:数组传参,形参不会创建新的数组
6:形参操作的数组和实参是同一个数组,不会开辟新的地址
一维数组传参举例:
#include <stdio.h>
void set_arr(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
arr[i] = -1;
}
}
void printf_arr(int arr[], int sz)//两个形参
{
for (int i = 0; i < sz; i++)
{
printf(“%d “, arr[i]);
}
printf(”\n”);
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
int sz = sizeof(arr) / sizeof(arr[0]); printf_arr(arr, sz);//先打印一次 //两个实参arr,sz //写一个函数,让arr中的元素全部变成-1 set_arr(arr, sz); //写一个函数,打印新的arr数组 printf_arr(arr, sz);
二维数组举例:
5:嵌套调用
嵌套调用就是函数间的相互调用,函数可以嵌套调用,不可以嵌套定义
#include <stdio.h>
//获取某年某月有多少天
int get_days_of_months(int y, int m)
{
int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//得到天数
int d = days[m];
if (is_leap_year(y)&&m == 2)//函数的嵌套调用
{
d += 1;
}
return d;
}
int is_leap_year(int y)//判断是否是闰年的函数
{
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
return 1;
else
return 0;
}
int main()
{
int y = 0;
int m = 0;
scanf(“%d %d”, &y, &m);
int d = get_days_of_months(y, m);
printf(“%d”, d);
return 0;
}