1. 函数的概念
函数是C语言程序的基本模块,类似于数学中的函数,接收输入参数并返回结果。
- 核心作用:将复杂任务拆解为多个小任务,提高代码复用性和可维护性。
- 分类:
- 库函数:由标准库提供(如printf、scanf)。
- -自定义函数:程序员根据需求编写。
2. 库函数
1 标准库和头文件
- 标准库:ANSI C定义的一组常用函数,如stdio.h(输入输出)、math.h(数学计算)。
- 头文件:包含函数声明,使用库函数前需包含对应头文件。
#include <math.h> // 使用sqrt函数需包含math.h
2 库函数的使用方法
- 以计算平方根函数sqrt为例:
#include <stdio.h>
#include <math.h>
int main() {
double d = 16.0;
double r = sqrt(d); // 调用sqrt计算平方根
printf("%lf\n", r); // 输出:4.000000
return 0;
}
- 函数原型:double sqrt(double x);
- 功能:计算x的平方根,返回double类型结果。
3. 自定义函数
1 语法形式
返回类型 函数名(参数列表) {
// 函数体
}
- 示例:实现加法函数
int Add(int x, int y) {
return x + y;
}
4. 形参和实参
- 实参:调用函数时传递的实际参数(如Add(a, b)中的a和b)。
- 形参:函数定义时声明的参数(如Add(int x, int y)中的x和y)。
- 关系:形参是实参的临时拷贝,二者独立存储。
5. return语句
- 返回结果,结束函数执行。
- 注意事项:
- 返回值类型需与函数声明一致。
- return后的代码不会执行。
- void函数可省略返回值。
6. 数组做函数参数
数组作为参数传递时,传递的是首元素地址,需额外传递数组长度:
void SetArray(int arr[], int sz) {
for (int i = 0; i < sz; i++) {
arr[i] = -1;
}
}
- 特点:形参数组与实参数组共享内存。
7. 嵌套调用与链式访问
1 嵌套调用
函数间互相调用,如判断某月天数:
int is_leap_year(int y); // 判断闰年
int get_days_of_month(int y, int m) {
if (is_leap_year(y) && m == 2) { // 嵌套调用
return 29;
}
// ...
}
2 链式访问
函数返回值作为另一函数的参数:
printf("%d\n", strlen("abc")); // 输出:3
8. 函数的声明和定义
1 单文件编程
- 声明:告知编译器函数的存在(需在调用前声明)。
- 定义:实现函数功能。
// 函数声明
int Add(int x, int y);
int main() {
int r = Add(2, 3); // 调用
// ...
}
// 函数定义
int Add(int x, int y) {
return x + y;
}
2 多文件编程
- 头文件(.h):存放函数声明。
- 源文件(.c):存放函数实现。
// add.h
int Add(int x, int y);
// add.c
#include "add.h"
int Add(int x, int y) {
return x + y;
}
9. static和extern
1 static修饰符
- 局部变量:延长生命周期至程序结束(存储在静态区)。
void test() {
static int i = 0; // 只初始化一次
i++;
}
- 全局变量/函数:限制作用域为当前文件
2 extern声明符
- 声明外部文件定义的全局变量或函数。
// file1.c
int g_val = 100;
// file2.c
extern int g_val; // 声明外部变量