函数
声明/定义、递归、函数指针。
30 分钟
函数
函数是 C 组织逻辑的基本单元。对照 /roadmaps/c,本课涵盖声明与定义、值传递、递归及函数指针——后续回调与数据结构的基础。
学习目标
- 区分函数声明、定义与原型
- 理解 C 的值传递语义
- 编写递归函数
- 初步使用函数指针
核心概念
声明、定义与调用
#include <stdio.h>
/* 声明(原型):编译器据此检查调用 */
int add(int a, int b);
void greet(const char *name);
/* 递归:阶乘 */
long factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
/* 定义 */
int add(int a, int b) {
return a + b;
}
void greet(const char *name) {
printf("Hello, %s\n", name);
}
/* 函数指针:排序比较器风格 */
typedef int (*compare_fn)(int, int);
int ascending(int a, int b) { return a - b; }
int descending(int a, int b) { return b - a; }
int pick_max(int a, int b, compare_fn cmp) {
return cmp(a, b) >= 0 ? a : b;
}
int main(void) {
int x = 10, y = 20;
printf("add=%d\n", add(x, y));
greet("CodeRoadMap");
int arr[] = {3, 1, 4, 1, 5};
int len = sizeof arr / sizeof arr[0];
int max_val = arr[0];
for (int i = 1; i < len; i++) {
max_val = pick_max(max_val, arr[i], ascending);
}
printf("fact(5)=%ld max=%d pick=%d\n",
factorial(5), max_val, pick_max(3, 7, descending));
return 0;
}
关键规则
| 概念 | 说明 |
|---|---|
| 值传递 | 修改形参不影响实参(指针除外) |
const T * | 指向只读数据,类似 Java 不可变引用 |
static 函数 | 文件内可见,类似 Java private 方法 |
| 无重载 | C 不支持同名不同参;C++ 可以 |
头文件(.h)放声明,源文件(.c)放定义——多文件项目的标准模式。
与 C++/Java 对照
| 特性 | C | C++ | Java |
|---|---|---|---|
| 成员函数 | 无 | 有 | 方法 |
| 重载 | 无 | 有 | 有 |
| 默认参数 | 无 | 有 | 有 |
| 函数指针 | 核心机制 | 可用 + 可调用对象 | 仅函数式接口/反射 |
| 递归 | 支持 | 支持 | 支持 |
Java 方法属于类;C 函数是文件级或 static 文件私有。C++ 可混用自由函数与成员函数。