一、函数定义的基本结构
返回类型 函数名(参数列表) {
// 函数体
// 语句序列
return 返回值; // 可选,取决于返回类型
}
二、函数定义的组成部分
1. 返回类型
可以是int, float, char, void等
void表示函数不返回值
默认返回类型为 int(不建议依赖默认值)
2. 函数名
有效的C标识符
遵循命名规则(字母、数字、下划线,不能以数字开头)
3. 参数列表
// 有参数
int add(int a, int b) { return a + b; }
// 无参数
void printHello(void) { printf("Hello"); }
void printHello() { printf("Hello"); }
4. 函数体
包含变量声明和执行语句
实现函数的具体功能
三、完整的函数定义示例
// 示例1:有返回值,有参数
int max(int x, int y) {
if (x > y) {
return x;
} else {
return y;
}
}
// 示例2:无返回值,有参数
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
// 示例3:无参数,无返回值
void greeting(void) {
printf("Welcome to C programming!\n");
}
// 示例4:返回指针
int* createArray(int size) {
int* arr = (int*)malloc(size * sizeof(int));
return arr;
}
// 示例5:递归函数
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
四、函数定义 vs 函数声明
// 函数声明(原型) - 在头文件或使用前声明
int add(int a, int b); // 只包含返回类型、函数名和参数类型
// 函数定义 - 在源文件中实现
int add(int a, int b) {
return a + b; // 包含具体实现
}
五、参数传递方式
// 1. 值传递(默认)
void modifyValue(int x) {
x = 100; // 只修改副本
}
// 2. 指针传递
void modifyPointer(int* x) {
*x = 100; // 修改原值
}
// 3. 数组传递(实际传递指针)
void modifyArray(int arr[], int size) {
arr[0] = 100; // 修改原数组
}
// 4. 结构体传递(值传递)
struct Point {
int x, y;
};
void modifyPoint(struct Point p) {
p.x = 100; // 只修改副本
}
// 5. 结构体指针传递
void modifyPointPtr(struct Point* p) {
p->x = 100; // 修改原结构体
}
六、静态函数
static int helperFunction(int x) {
// 只能在本文件中访问
return x * 2;
}
七、内联函数
inline int square(int x) {
return x * x;
// 建议编译器将函数代码直接插入调用处
// 减少函数调用开销
}
八、可变参数函数
#include <stdarg.h>
int sum(int count, ...) {
int total = 0;
va_list args;
va_start(args, count);
for (int i = 0; i < count; i++) {
total += va_arg(args, int);
}
va_end(args);
return total;
}
// 使用
int result = sum(4, 1, 2, 3, 4); // 返回10