C语言快速入门教程
首页
入门指南
基础教程
进阶教程
实战案例
编程指南
首页
入门指南
基础教程
进阶教程
实战案例
编程指南
  • 基础教程

    • Hello World 深入理解
    • 变量详解
    • 数据类型详解
    • 运算符详解
    • 输入输出详解
    • 条件判断 if-else
    • 循环语句
    • 函数详解
    • 数组详解

函数详解

嗨,我是长安!

函数是我当年学C语言时的一个转折点。一旦掌握了函数,你会发现代码变得特别整洁,再也不用重复写相同的代码了。

函数就像一个"小工具",可以重复使用,让代码更简洁!

为什么需要函数?

没有函数的代码

// 计算面积要写3次!
int area1 = 10 * 20;
int area2 = 5 * 8;
int area3 = 15 * 12;

有了函数

int calculateArea(int length, int width) {
    return length * width;
}

int area1 = calculateArea(10, 20);
int area2 = calculateArea(5, 8);
int area3 = calculateArea(15, 12);

优点:

  • ✅ 代码重用(我现在特别喜欢这个)
  • ✅ 易于维护(改一处就行)
  • ✅ 逻辑清晰(代码看着舒服)

函数的定义

基本语法

返回类型 函数名(参数列表) {
    // 函数体
    return 返回值;
}

示例

#include <stdio.h>

// 函数定义
int add(int a, int b) {
    int sum = a + b;
    return sum;
}

int main() {
    int result = add(5, 3);  // 函数调用
    printf("5 + 3 = %d\n", result);
    
    return 0;
}

函数的组成部分

int add(int a, int b) {
    return a + b;
}
  • int - 返回类型
  • add - 函数名
  • int a, int b - 参数列表
  • return a + b - 返回值

无返回值函数(void)

#include <stdio.h>

void printHello() {
    printf("Hello, World!\n");
    // 不需要return
}

void printLine() {
    printf("===================\n");
}

int main() {
    printLine();
    printHello();
    printLine();
    
    return 0;
}

无参数函数

#include <stdio.h>

int getRandomNumber() {
    return 42;  // 假装是随机数😄
}

int main() {
    int num = getRandomNumber();
    printf("随机数:%d\n", num);
    
    return 0;
}

函数原型(声明)

函数使用前必须先声明或定义:

方法1:函数定义在main前面

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    printf("%d\n", add(5, 3));
    return 0;
}

方法2:使用函数原型

#include <stdio.h>

// 函数声明(原型)
int add(int a, int b);

int main() {
    printf("%d\n", add(5, 3));
    return 0;
}

// 函数定义可以在后面
int add(int a, int b) {
    return a + b;
}

参数传递

值传递

C语言的参数传递是值传递(复制):

#include <stdio.h>

void changeValue(int x) {
    x = 100;
    printf("函数内:x = %d\n", x);
}

int main() {
    int num = 10;
    changeValue(num);
    printf("函数外:num = %d\n", num);  // num还是10
    
    return 0;
}

输出:

函数内:x = 100
函数外:num = 10

长安的经验

想象你给朋友一张照片的复印件,他在复印件上涂画,不会影响你的原件。

我当年就是用这个比喻理解的值传递!

实战案例

案例1:判断素数

#include <stdio.h>
#include <stdbool.h>

bool isPrime(int n) {
    if (n < 2) return false;
    
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    
    return true;
}

int main() {
    for (int i = 1; i <= 20; i++) {
        if (isPrime(i)) {
            printf("%d ", i);
        }
    }
    printf("\n");
    
    return 0;
}

案例2:求最大值

#include <stdio.h>

int max(int a, int b) {
    return (a > b) ? a : b;
}

int max3(int a, int b, int c) {
    return max(max(a, b), c);
}

int main() {
    printf("最大值:%d\n", max(10, 20));
    printf("三数最大:%d\n", max3(15, 8, 23));
    
    return 0;
}

案例3:打印菜单

#include <stdio.h>

void printMenu() {
    printf("\n=== 学生管理系统 ===\n");
    printf("1. 添加学生\n");
    printf("2. 删除学生\n");
    printf("3. 查询学生\n");
    printf("4. 退出系统\n");
    printf("==================\n");
    printf("请选择:");
}

int main() {
    int choice;
    
    while (1) {
        printMenu();
        scanf("%d", &choice);
        
        if (choice == 4) {
            printf("再见!\n");
            break;
        }
        
        printf("你选择了选项%d\n", choice);
    }
    
    return 0;
}

案例4:计算器

#include <stdio.h>

float add(float a, float b) {
    return a + b;
}

float subtract(float a, float b) {
    return a - b;
}

float multiply(float a, float b) {
    return a * b;
}

float divide(float a, float b) {
    if (b == 0) {
        printf("错误:除数不能为0\n");
        return 0;
    }
    return a / b;
}

int main() {
    float num1, num2;
    char op;
    
    printf("输入表达式(如:5 + 3):");
    scanf("%f %c %f", &num1, &op, &num2);
    
    float result;
    switch (op) {
        case '+':
            result = add(num1, num2);
            break;
        case '-':
            result = subtract(num1, num2);
            break;
        case '*':
            result = multiply(num1, num2);
            break;
        case '/':
            result = divide(num1, num2);
            break;
        default:
            printf("无效运算符\n");
            return 1;
    }
    
    printf("%.2f %c %.2f = %.2f\n", num1, op, num2, result);
    
    return 0;
}

递归函数

函数可以调用自己!

阶乘示例

#include <stdio.h>

int factorial(int n) {
    if (n == 0 || n == 1) {
        return 1;  // 基础情况
    }
    return n * factorial(n - 1);  // 递归
}

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

斐波那契数列

#include <stdio.h>

int fibonacci(int n) {
    if (n == 1 || n == 2) {
        return 1;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}

int main() {
    for (int i = 1; i <= 10; i++) {
        printf("%d ", fibonacci(i));
    }
    printf("\n");
    
    return 0;
}

注意

递归要有终止条件,否则会无限循环!

变量作用域

局部变量

#include <stdio.h>

void func() {
    int x = 10;  // 局部变量
    printf("func中的x:%d\n", x);
}

int main() {
    int x = 20;  // 另一个局部变量
    printf("main中的x:%d\n", x);
    func();
    
    return 0;
}

全局变量

#include <stdio.h>

int globalVar = 100;  // 全局变量

void printGlobal() {
    printf("全局变量:%d\n", globalVar);
}

int main() {
    printGlobal();
    globalVar = 200;
    printGlobal();
    
    return 0;
}

练习题

练习1:计算幂

编写函数计算a的b次方。

练习2:判断回文数

判断一个数是否是回文数(如121)。

练习3:打印图案

用函数打印n行的星号三角形。

答案参考

查看答案

练习1:

#include <stdio.h>

int power(int base, int exp) {
    int result = 1;
    for (int i = 0; i < exp; i++) {
        result *= base;
    }
    return result;
}

int main() {
    printf("2^10 = %d\n", power(2, 10));
    return 0;
}

练习2:

#include <stdio.h>
#include <stdbool.h>

bool isPalindrome(int num) {
    int original = num;
    int reversed = 0;
    
    while (num > 0) {
        reversed = reversed * 10 + num % 10;
        num /= 10;
    }
    
    return original == reversed;
}

int main() {
    int num = 121;
    if (isPalindrome(num)) {
        printf("%d是回文数\n", num);
    } else {
        printf("%d不是回文数\n", num);
    }
    return 0;
}

练习3:

#include <stdio.h>

void printTriangle(int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            printf("*");
        }
        printf("\n");
    }
}

int main() {
    printTriangle(5);
    return 0;
}

知识点总结

  • ✅ 函数定义:返回类型 + 函数名 + 参数
  • ✅ void:无返回值
  • ✅ 函数原型:提前声明
  • ✅ 值传递:传递的是副本
  • ✅ 递归:函数调用自己
  • ✅ 作用域:局部变量和全局变量

下一步

👉 数组详解

最近更新: 2025/12/26 14:29
Prev
循环语句
Next
数组详解