函数
1.函数的概念
C语言中的函数就是一个完成某项特定任务的一小段代码
在C语言中我们一般会见到两类函数:
- 库函数
- 自定义函数
2.库函数
C语言的国际标准ANSI C规定了⼀些常⽤的函数的标准,被称为标准库,那不同的编译器厂商根据ANSI提供的C语⾔标准就给出了⼀系列函数的实现。
库函数相关的头文件:https://zh.cppreference.com/w/c/header
库函数的学习和查看工具:https://legacy.cplusplus.com/reference/clibrary/
库函数文档的一般格式
- 函数原型
- 函数功能介绍
- 参数和返回类型说明
- 代码举例
- 代码输出
- 相关知识链接
3.自定义函数
自定义函数比库函数更加重要,也能给程序员写代码更多的创造性
3.1 函数的语法形式
type fun_name(形式参数)
{
}
type
是函数的返回类型fun_name
是函数名- 括号中放的是形式参数
+{ }
括起来的是函数体
3.2 函数举例
写一个加法函数,完成2个整型变量的加法操作
#include <stdio.h>
int add(int a,int b)
{
return a+b;
}
int main()
{
int a=0;
int b=0;
scanf("%d%d",&a,&b);
int sum=add(a,b);
printf("%d\n",sum);
return 0;
}
4.形参和实参
#include <stdio.h>
int add(int x,int y)
{
return x+y;
}
int main()
{
int a=0;
int b=0;
scanf("%d%d",&a,&b);
int sum=add(a,b);
printf("%d\n",sum);
return 0;
}
4.1实参
在上面的代码中,第3~6行是add
函数的定义,有了函数后,再第12行调用add
函数。我们把第12行调用add
函数时,传递给函数的参数a
和b
,称为实际参数,简称实参。
实参就是真实传递给函数的参数。
4.2形参
在上面代码中,在定义函数时,在函数名add
后的括号中写的x
和y
称为形式参数,简称形参。
为什么叫形式参数呢?实际上,如果只是定义了add
函数,而不去调用的话,add
函数的参数x
和y
只是形式上存在的,不会向内存申请空间,不会真实存在。所以叫形式参数。
4.3 实参和形参的关系
形参是实参的一份临时拷贝
5.return 语句
return
后边可以是一个数值,也可以是一个表达式,如果是表达式则先执行表达式,再返回表达式的结果。return
后边也可以什么也没有,直接写return ;
这种写法适合函数返回类型是void
的情况。return
返回值和函数返回类型不一致时,系统会自动将返回的值隐式转换为函数的返回类型。return
语句执行后,函数就彻底返回,后边的代码不再执行。
6.数组做函数参数
数组传参的几个重点:
- 函数的形式参数要和函数的实际参数个数匹配
- 函数的实参是数组,形参也可以写成数组形式。
- 形参如果是一维数组,数组的大小可以省略不写
- 形参如果是二位数组,行可以省略,列不能省略。
- 数组传参,形参是不会创建新的数组的。
- 形参操作的数组和实参的数组是同一个数组。
7.嵌套调用和链式访问
7.1 嵌套调用
嵌套调用就是函数之间的互相调用
假设我们计算某年某月有多少天?如果要函数实现,可以设计2个函数:
is_leap_year()
:根据年份确定是否是闰年get_days_of_month()
:调用is_leap_year()
确定是否是闰年后,再根据月计算这个月的天数
int is_leap_year(int y)
{
if(y%4==0&&y%100!=0||y%400==0)
{
return 1;
}else
return 0;
}
int get_days_of_month(int y,int m)
{
int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int day=day[m];
if(is_leap_year(y)&&m==2)
day+=1;
return day;
}
int main()
{
int y,m;
scanf("%d%d",&y,&m);
int d=get_days_of_month(y,m);
printf("%d\n",d);
return 0;
}
main
函数调用scanf.printf,get_days_of_month
get_days_of_month
调用is_leap_year
函数可以嵌套调用,但是函数不能嵌套定义
7.2链式访问
所谓链式访问就是将一个函数的返回值作为另一个函数的参数,像链条一样将函数串起来就是函数的链式访问。
#include <tdio.h>
#include <string.h>
int main()
{
printf("%d\n",strlen("abcdef"));//链式访问
return 0;
}
8.函数的声明和定义
如果我们把函数的定义写在了main
函数后面,则我们需要在main
函数前面对该函数进行声明。
#include <stdio.h>
int add(int a,int b);//函数的声明
int main()
{
int a=0;
int b=0;
scanf("%d%d",&a,&b);
int sum=add(a,b);
printf("%d\n",sum);
return 0;
}
int add(int a,int b)
{
return a+b;
}