前言:
“函数”这个名词,我们每个人都是耳濡目染。高中数学中的函数已经够让我们头疼了,而现在在C语言中又遇到了“函数”,但这个知识点是我们必须要掌握的,因为函数在C语言中扮演着至关重要的角色,函数不仅是组织和复用代码的有效手段,更是构建复杂程序的基石,下面就让我们一起来挑战挑战C语言中的函数吧。
目录:
- 一 、 函数的概念
- 二 、库函数
- 1.标准库
- 2.头文件
- 三、自定义函数
- 四、函数的参数
- 1.实参
- 2.形参
- 3.数组做函数参数
- 4.return 语句
- 五、函数的嵌套调用和链式访问
- 1.嵌套调用
- 2.链式访问
- 六、函数的声明和定义
一 、 函数的概念
在C语言中,函数也被称为“子程序”。函数就是一段完成特定任务的代码块,它可以**接收输入的数据(参数),并返回一个值**
。而C语言程序就是由一个个函数组成的。
C语言中常见的两类函数:
1. 库函数;
2. 自定义函数
二 、库函数
1.标准库
C语言国际标准ANSI C规定了一些常用函数的标准,称为标准库。然后编译器厂商根据这些规定的C语言标准给出了一系列函数的实现,这些函数被称为库函数。库函数一定程度上提高了程序员的工作效率,因为它可以直接使用,不用人们去实现一些常见的功能,而浪费时间。
C语言中常用的库函数:
- IO函数
- 字符串函数
- 字符操作函数
- 内存操作函数
- 时间/日期函数
- 数学函数
- 其他库函数
2.头文件
库函数是在标准库中对应的头文件中声明的,所以库函数的使用必须包含头文件
eg:
//#included <stdio.h>
//printf;
//scanf;
printf , scanf
是我们常用的库函数,#include<stdio.h> 是它们的头文件
库函数相关头文件:https://zh.cppreference.com/w/c/header
包括函数原型,功能介绍,参数,返回值,代码举例…
大家可以去了解看看。
三、自定义函数
库函数只是为了便捷我们的使用,更重要的是自定义函数
。语法如下:
ret_type fun_name(形式参数)
{
}
- ret_type: 函数返回类型
- fun_name: 函数名
- 括号中是形式参数
- {}中是函数体
eg:加法函数,完成两数相加。函数名:Add,接受两个整形类型的参数,计算的结果也是整形
#include<stdio.h>
int Add(int i, int j)
{
return i + j;
}
int main()
{
int i = 0;
int j = 0;
scanf("%d %d", &i, &j);
int a = Add(i, j);//调用加法函数
printf("%d\n", a);
return 0;
}
四、函数的参数
函数的参数分为实参和形参
1.实参
根据上面的举例:
这块的 i 和 j 为实际参数(实参就是真实传递给函数的参数)
2.形参
这块的 i 和 j 为形式参数,(如果只是定义了Add函数而不去调用的话,Add函数的参数只是形式上存在,不会向内存申请空间,不真实存在,所以叫形式参数。它只有在函数被调用过程中为了存放实参时才会向内存申请空间,这个过程就是形参的实例化。调用的话就会发现,形参和实参的地址是不一样的,形参是实参的一份临时拷贝。
3.数组做函数参数
数组也可以做函数参数
eg:写一个函数,将一个数组中的内容全部变为6,再写一个函数将其打印出来
#include<stdio.h>
void set_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = 6;
}
}
void printf_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
set_arr(arr,sz);//设置数组内容为6
printf_arr(arr,sz);
return 0;
}
执行结果:
注:
- 函数的形参要和实参个数匹配
- 函数的实参是数组,形参也可写成数组形式
- 形参如果是一维数组,数组大小可以省略
- 形参如果是二维数组,行可以省略,列不能省略
- 数组传参,形参不会创建新的数组
4.return 语句
- return 后面可以是一个数值,也可以是一个表达式,返回的是表达式的结果;
- 返回类型是void时,return后面可以什么都不写;
- return语句执行后,函数返回,后面的代码将不再执行;
- return返回的值和函数返回的类型不一致时,系统将自动定义为函数的返回类型;
- 函数中如果有if 语句,每种情况下都得有return返回;
- 函数的返回类型如果不写,则默认返回类型是Int;
- 写了返回类型,但没写return返回值,则返回值未知
五、函数的嵌套调用和链式访问
1.嵌套调用
嵌套调用就是函数之间的互相调用,下面用一个例子来表达一下吧
eg:计算某年某月有多少天
- is_leap_year() : 判断闰年
- get_days_of_month : 调用 is_leap_year()后,再计算某月的天数
#include<stdio.h>
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, 3 };
int day = days[m];
if (is_leap_year(y) && m == 2)//调用
day += 1;
return day;
}
int main()
{
int y = 0;
int m = 0;
scanf("%d %d", &y, &m);
int d = get_days_of_month(y, m);
printf("%d\n", d);
return 0;
}
执行结果:输入2024年2月
2.链式访问
链式访问就是将一个函数的返回值作为另一个函数的参数
int main()
{
printf("%d",printf("%d",printf("%d",68)));
return 0;
}
printf函数返回的是打印在屏幕上的个数,所以最终打印 6821
六、函数的声明和定义
函数的定义就是函数的具体实现
还用上面的代码来举例吧
这个就是函数的定义:
int is_leap_year(int y)//判断闰年
{
if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
return 1;
else
return 0;
}
函数的声明:
int is_leap_year(int y)
函数的使用必须先声明后使用,其实函数的定义也是一种特殊的声明,所以函数定义放在调用之前也是可以的。
总结:
C语言函数这一章节,是我们想成为编程高手,必掌握的一步,我们通过定义和使用函数,可以构建出结构清晰,功能强大的C语言程序。好了,这一篇就讲到这里了,感觉有收获的话,别忘了留下你的关注和三连哦!