本文最后更新于 2026-02-28,文章内容可能已经过时。

C语言函数是执行特定任务的代码模块单元,分为标准库函数(如printf)和自定义函数,通过定义(指定返回类型、函数名和参数列表)与调用(实参与形参匹配)实现模块化编程,显著提升代码复用性、可读性和可维护性;使用时需遵循单一职责原则、确保参数类型兼容,并正确处理返回值(有返回值用return,无返回值用void),避免函数过长或逻辑复杂。

一、函数的基本概念

函数是C语言中的基本模块单元,设计为执行一项特定任务,其名称通常会反映该任务。C语言中的函数是一段完成特定独立任务的代码片段,具有固定语法格式和调用规则。

核心价值

  • 模块化编程:将大型程序拆解为多个小函数,降低代码复杂度,便于维护和调试
  • 代码复用:同一功能的函数可在程序中多次调用,无需重复编写
  • 可读性提升:函数名按功能命名(如max表示最大值、is_leap_year表示判断闰年),使代码逻辑更清晰

二、函数的分类

1. 库函数

  • 由C语言标准库(ANSI C规定)提供,编译器厂商实现的现成函数
  • 需包含对应头文件(如#include <stdio.h>#include <math.h>
  • 示例:
    • 输入输出函数:printf()scanf()
    • 数学函数:sqrt()(平方根)、pow()(幂运算)
    • 字符串操作:strlen()(长度)、strcpy()(拷贝)

2. 自定义函数

  • 由开发者根据实际需求编写的函数
  • 灵活性强,是编程核心
  • 示例:实现两个数的乘法、数组排序等

三、函数的定义与语法

1. 函数的基本结构

返回类型 函数名(参数列表) {
    // 函数体
    // 代码实现
    return 返回值; // 如果有返回值
}

2. 函数定义示例

示例1:求两个整数的最大值

int max(int x, int y) {
    int z;
    z = x > y ? x : y;
    return z;
}

示例2:交换两个浮点数(使用指针)

void swap(double *p1, double *p2) {
    if (p1 == NULL || p2 == NULL) 
        return;
    double tmp;
    tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

示例3:初始化液晶屏,获取显存入口指针

char *initLCD(void) {
    int lcd = open("/dev/fb0", O_RDWR);
    struct fb_var_screeninfo vinfo;
    ioctl(lcd, FBIOGET_VSCREENINFO, &vinfo);
    int bpp = vinfo.bits_per_pixel;
    int size = vinfo.xres * vinfo.yres * bpp / 8;
    char *fbmem = mmap(NULL, size, PROT_READ, MAP_SHARED, lcd, 0);
    return fbmem;
}

四、函数的调用

1. 函数调用的一般形式

函数名(实参表列);
  • 如果是调用无参函数,则"实参表列"可以没有,但括号不能省略
  • 如果实参列表包含多个实参,则各参数间用逗号隔开
  • 实参与形参的个数应相等,类型应一致

2. 函数调用的三种方式

调用方式说明示例
函数语句函数调用作为一个语句printstar();
函数表达式函数出现在表达式中result = max(a, b);
函数参数函数调用作为另一个函数的参数printf("Result: %d", max(a, b));

五、函数的参数与返回值

1. 参数传递

  • 形参:函数定义时的参数,是函数的输入
  • 实参:函数调用时的参数,是实际传递给函数的值
  • 实参与形参按顺序对应,一一传递数据

2. 返回值

  • 有返回值函数:使用return语句返回一个值
  • 无返回值函数:使用void作为返回类型,不返回任何值

六、函数的高级特性

1. 内联函数

通过inline关键字声明,编译器会将函数调用替换为函数代码本身,提高性能。

2. 函数指针

函数指针可以存储函数的地址,实现回调函数、动态函数调用等功能。

3. 函数重载

C++中允许函数名相同但参数类型或数量不同的多个函数,C语言不支持函数重载。

七、函数的使用原则

  1. 单一职责原则:每个函数应只完成一个特定任务
  2. 命名规范:函数名应清晰反映其功能
  3. 接口简洁:函数的输入输出接口应简洁明了
  4. 避免过长函数:复杂算法应分解为多个更简单的函数

八、函数的实际应用示例

1. 库函数应用示例(输入输出)

#include <stdio.h>

int main() {
    int age = 25;
    float height = 1.75f;
    char *name = "Alice";
    
    printf("Name: %s\n", name);
    printf("Age: %d, Height: %.2f meters\n", age, height);
    
    return 0;
}

2. 自定义函数应用示例(求阶乘)

#include <stdio.h>

int factorial(int n) {
    if (n < 0) 
        return -1; // 错误处理
    if (n == 0) 
        return 1;
    
    int result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

int main() {
    int num = 5;
    printf("%d! = %d\n", num, factorial(num));
    return 0;
}

九、函数的注意事项

  1. 函数必须先声明或定义后才能被调用
  2. 调用函数时,实参的类型必须与形参兼容
  3. 对于数组参数,通常使用指针传递,避免复制整个数组
  4. 避免函数过于复杂,应保持函数长度适中,执行单一任务

通过正确使用函数,可以大大提高C语言程序的可读性、可维护性和代码复用率,是C语言编程中不可或缺的核心概念。