C语言入门教程 | 第七讲:函数和程序结构完全指南

C语言入门教程 | 第七讲:函数和程序结构完全指南

💡 写在前面:如果说变量是程序的砖块,那么函数就是建筑的房间。本文将带你从零开始,彻底搞懂C语言中的函数和程序结构。不管你是刚入门的小白,还是想巩固基础的同学,这篇文章都会让你豁然开朗!

一、为什么需要函数?🤔

想象一下,你每次想打印"Hello World"都要写一遍printf,每次要计算平均值都要写一堆代码,是不是很麻烦?

函数的三大好处:

(1)代码复用 - 写一次,用无数次

c 复制代码
// 没有函数的写法(糟糕示范❌)
printf("欢迎来到游戏世界!\n");
printf("正在加载...\n");
// 游戏中...
printf("欢迎来到游戏世界!\n");  // 又写一遍
printf("正在加载...\n");        // 又写一遍

// 使用函数的写法(推荐✅)
void showWelcome() {
    printf("欢迎来到游戏世界!\n");
    printf("正在加载...\n");
}

// 调用时只需一行
showWelcome();  // 第一次
showWelcome();  // 第二次

(2)模块化 - 让代码像积木一样清晰

c 复制代码
// 主程序变得非常简洁
int main() {
    初始化游戏();
    显示菜单();
    开始游戏();
    保存记录();
    退出程序();
    return 0;
}

(3)易于维护 - 修改一处,处处生效

如果需要修改欢迎信息,只需改动函数内部,所有调用的地方自动更新!


二、函数的基础知识📚

(1)函数的基本结构

c 复制代码
返回值类型 函数名(参数列表)
{
    // 函数体(具体要执行的代码)
    return 返回值;  // 如果有返回值的话
}

拆解说明:

  • 返回值类型:函数执行完后要返回什么类型的数据?(int、float、void等)
  • 函数名:给函数起个有意义的名字,见名知意
  • 参数列表:函数需要哪些"原材料"来工作
  • 函数体:具体干活的代码
  • return:把结果交出去

(2)最简单的函数:无参数、无返回值

c 复制代码
#include <stdio.h>

// 定义一个最简单的函数
// void 表示"无",这里表示没有返回值
void sayHello() {
    printf("Hello, Micu!\n");
    printf("很高兴认识你!\n");
}

int main() {
    // 调用函数:函数名+小括号
    sayHello();  // 输出:Hello, Micu! 很高兴认识你!
    sayHello();  // 可以多次调用
  
    return 0;
}

💡 小贴士:

  • void在函数前面表示"没有返回值"
  • void在参数位置表示"没有参数"(可以省略不写)

(3)有参数、有返回值的函数

c 复制代码
#include <stdio.h>

// 计算两个整数的平均值
// 参数:int a, int b(需要两个整数)
// 返回值:float(返回一个小数)
float calculateAverage(int a, int b) {
    // 为什么用 2.0f 而不是 2?
    // 因为整数除法会丢掉小数部分!
    // 3 / 2 = 1(整数除法)
    // 3 / 2.0f = 1.5(浮点数除法)
    float result = (a + b) / 2.0f;
    return result;  // 把结果返回给调用者
}

int main() {
    int num1 = 10;
    int num2 = 15;
  
    // 调用函数,并用变量接收返回值
    float avg = calculateAverage(num1, num2);
  
    printf("平均值是:%.2f\n", avg);  // 输出:平均值是:12.50
  
    // 函数调用也可以直接用在表达式中
    printf("另一组数的平均值:%.2f\n", calculateAverage(20, 30));
  
    return 0;
}

🔥 重要提醒:

c 复制代码
// ❌ 错误写法
int average = (a + b) / 2;   // 结果是整数,会丢掉小数

// ✅ 正确写法
float average = (a + b) / 2.0f;  // 结果是小数

(4)函数的多种返回方式

c 复制代码
#include <stdio.h>

// 示例1:返回计算结果
int add(int a, int b) {
    return a + b;  // 直接返回表达式的结果
}

// 示例2:返回比较结果(判断是否及格)
int isPassed(int score) {
    if (score >= 60) {
        return 1;  // 1表示真(及格了)
    } else {
        return 0;  // 0表示假(没及格)
    }
}

// 示例3:提前返回(遇到错误立即退出)
float safeDivide(int a, int b) {
    if (b == 0) {
        printf("错误:除数不能为0!\n");
        return 0.0f;  // 遇到错误,提前返回
    }
    return (float)a / b;  // 正常情况下的返回
}

int main() {
    printf("5 + 3 = %d\n", add(5, 3));
    printf("85分及格了吗?%d\n", isPassed(85));  // 输出1(真)
    printf("45分及格了吗?%d\n", isPassed(45));  // 输出0(假)
    printf("10 / 2 = %.2f\n", safeDivide(10, 2));
    printf("10 / 0 = %.2f\n", safeDivide(10, 0));  // 会提示错误
  
    return 0;
}

三、值传递 vs 指针传递(重点难点)⚠️

这是初学者最容易混淆的部分!让我们用最直白的方式讲清楚。

(1)为什么值传递不能交换变量?

问题场景: 想写一个函数交换两个变量的值

c 复制代码
#include <stdio.h>

// ❌ 错误的交换函数(值传递)
void wrongSwap(int x, int y) {
    printf("函数内交换前:x=%d, y=%d\n", x, y);
  
    int temp = x;
    x = y;
    y = temp;
  
    printf("函数内交换后:x=%d, y=%d\n", x, y);
    // 看起来交换成功了,但这只是"假象"!
}

int main() {
    int a = 10;
    int b = 20;
  
    printf("调用前:a=%d, b=%d\n", a, b);
    wrongSwap(a, b);
    printf("调用后:a=%d, b=%d\n", a, b);
    // 😱 惊了!a和b居然没有交换!
  
    return 0;
}

/* 输出结果:
调用前:a=10, b=20
函数内交换前:x=10, y=20
函数内交换后:x=20, y=10
调用后:a=10, b=20    <-- 还是原来的值!
*/

🤔 为什么会这样?

让我用一个生活中的例子解释:

css 复制代码
想象你有两张纸条:
纸条A写着"10",纸条B写着"20"

值传递就像:
1. 你把纸条A和B的内容抄写到两张新纸条上(复印件)
2. 把复印件给函数
3. 函数修改的是复印件
4. 但你手里的原件(a和b)完全没变!

这就是"值传递":传递的是值的副本,不是变量本身

(2)正确的方法:指针传递

c 复制代码
#include <stdio.h>

// ✅ 正确的交换函数(指针传递)
void correctSwap(int *x, int *y) {
    // *x 表示"x指向的那个变量"
    // *y 表示"y指向的那个变量"
  
    printf("函数内交换前:*x=%d, *y=%d\n", *x, *y);
  
    int temp = *x;   // temp = x指向的值
    *x = *y;         // 把y指向的值赋给x指向的变量
    *y = temp;       // 把temp的值赋给y指向的变量
  
    printf("函数内交换后:*x=%d, *y=%d\n", *x, *y);
}

int main() {
    int a = 10;
    int b = 20;
  
    printf("调用前:a=%d, b=%d\n", a, b);
  
    // &a 表示"a的地址",&b 表示"b的地址"
    // 我们不是传值,而是传"地址"(告诉函数变量在哪)
    correctSwap(&a, &b);
  
    printf("调用后:a=%d, b=%d\n", a, b);
    // 🎉 成功!a和b真的交换了!
  
    return 0;
}

/* 输出结果:
调用前:a=10, b=20
函数内交换前:*x=10, *y=20
函数内交换后:*x=20, *y=10
调用后:a=20, b=10    <-- 交换成功!
*/

🔑 指针传递的关键:

markdown 复制代码
继续用纸条的例子:

指针传递就像:
1. 你不给函数纸条的内容
2. 而是告诉函数"纸条A在桌子的左边,纸条B在右边"(地址)
3. 函数根据地址,直接去你的桌子上修改原件
4. 这样就真的改变了原来的纸条!

记住:
- &a  →  取地址(告诉函数a在哪)
- *x  →  取值(访问x指向的那个变量)

(3)指针的记忆技巧

c 复制代码
int a = 10;      // 定义一个普通变量
int *p;          // 定义一个指针变量(能存地址的变量)

p = &a;          // p存储a的地址(p指向a)

// 读取时:
printf("%d", a);   // 直接读a的值:10
printf("%d", *p);  // 读p指向的值:也是10

// 修改时:
a = 20;            // 直接修改a
*p = 20;           // 通过指针修改a(效果相同)

// 记忆口诀:
// & → "取地址" → "在哪里"
// * → "取值"   → "是什么"

四、递归函数的奥秘🌀

递归就是"自己调用自己",听起来很玄乎,但其实很好理解!

(1)什么是递归?

生活中的递归例子:

text 复制代码
你在镜子前面举起一面镜子,会看到什么?
→ 镜子里有镜子,镜子里的镜子里还有镜子...
→ 这就是递归!一直重复,直到某个条件终止

(2)递归函数的必备要素

c 复制代码
int 递归函数(int n) {
    // 1. 终止条件(非常重要!没有它会无限循环)
    if (满足某个条件) {
        return 某个值;  // 停止递归
    }
  
    // 2. 递归调用(向终止条件靠近)
    return 某个表达式 + 递归函数(更小的n);
}

(3)实战:计算阶乘

c 复制代码
#include <stdio.h>

// 计算n的阶乘:n! = n × (n-1) × (n-2) × ... × 2 × 1
// 例如:5! = 5 × 4 × 3 × 2 × 1 = 120
int factorial(int n) {
    // 终止条件:1的阶乘是1,0的阶乘也是1
    if (n <= 1) {
        return 1;
    }
  
    // 递归调用:n! = n × (n-1)!
    // 把问题拆解成更小的子问题
    return n * factorial(n - 1);
}

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

📊 递归执行过程可视化:

matlab 复制代码
计算 factorial(5) 的过程:

factorial(5)
    = 5 × factorial(4)
    = 5 × (4 × factorial(3))
    = 5 × (4 × (3 × factorial(2)))
    = 5 × (4 × (3 × (2 × factorial(1))))
    = 5 × (4 × (3 × (2 × 1)))          ← 到达终止条件
    = 5 × (4 × (3 × 2))                ← 开始返回
    = 5 × (4 × 6)
    = 5 × 24
    = 120

就像俄罗斯套娃:
拆开 → 拆开 → 拆开 → 到最小的 → 组装 → 组装 → 组装

(4)递归 vs 循环

同样的功能,用循环也能实现:

c 复制代码
// 方法1:递归实现
int factorial_recursive(int n) {
    if (n <= 1) return 1;
    return n * factorial_recursive(n - 1);
}

// 方法2:循环实现
int factorial_loop(int n) {
    int result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

对比:

特性 递归 循环
代码简洁性 ✅ 更简洁优雅 ❌ 相对繁琐
理解难度 ❌ 需要一定思维训练 ✅ 更直观
性能 ❌ 较慢(函数调用开销) ✅ 更快
适用场景 树、图等复杂结构 简单的重复操作

五、C程序的完整结构🏗️

一个规范的C程序应该是这样的:

c 复制代码
// ========== 第1部分:预处理指令 ==========
// 告诉编译器需要哪些"工具包"
#include <stdio.h>    // 标准输入输出(printf、scanf等)
#include <stdlib.h>   // 标准库函数(malloc、exit等)
#include <string.h>   // 字符串处理函数

// ========== 第2部分:符号常量定义 ==========
#define PI 3.14159    // 定义常量
#define MAX_SIZE 100

// ========== 第3部分:全局变量声明 ==========
// 全局变量:在整个程序中都可以访问
int globalCount = 0;  // 全局变量会自动初始化为0

// ========== 第4部分:函数声明 ==========
// 先声明,告诉编译器"这个函数存在"
void printMenu();               // 显示菜单
int getUserChoice();            // 获取用户选择
float calculateSum(int a, int b);  // 计算和

// ========== 第5部分:main函数(程序入口)==========
int main() {
    // 局部变量:只在main函数内有效
    int choice = 0;     // ⚠️ 必须初始化!否则是随机值
    float result = 0.0f;
  
    // 程序从这里开始执行
    printf("程序启动!\n");
  
    printMenu();                        // 调用函数
    choice = getUserChoice();           // 调用并接收返回值
    result = calculateSum(10, 20);      // 调用并计算
  
    printf("结果:%.2f\n", result);
  
    return 0;  // 返回0表示程序正常结束
}

// ========== 第6部分:函数定义(具体实现)==========
// 把刚才声明的函数,在这里写出具体代码

void printMenu() {
    printf("===================\n");
    printf("1. 开始游戏\n");
    printf("2. 查看设置\n");
    printf("3. 退出\n");
    printf("===================\n");
}

int getUserChoice() {
    int choice;
    printf("请输入选择:");
    scanf("%d", &choice);
    return choice;
}

float calculateSum(int a, int b) {
    return (float)(a + b);
}

(1)关键规则解析

❗ 规则1:所有代码必须在函数内

c 复制代码
// ❌ 错误:不能在函数外写执行语句
printf("Hello");  // 编译错误!

// ✅ 正确:必须在函数内
int main() {
    printf("Hello");  // OK
    return 0;
}

❗ 规则2:局部变量必须初始化

c 复制代码
void test() {
    int a;           // ⚠️ 危险!a是随机值(垃圾值)
    printf("%d", a); // 可能输出任何数字:3847582、-23、0...
  
    int b = 0;       // ✅ 安全!b被初始化为0
    printf("%d", b); // 输出:0
}

❗ 规则3:函数调用前必须声明

c 复制代码
int main() {
    test();  // ❌ 错误!编译器不知道test是什么
    return 0;
}

void test() {
    printf("测试\n");
}

// 解决方法1:函数定义写在main前面
// 解决方法2:在main前面先声明
void test();  // 函数声明

六、多文件编程实战🗂️

当程序变大时,把所有代码写在一个文件里会很混乱。多文件编程让代码更有条理!

(1)为什么要多文件?

c 复制代码
想象你在写一本书:
- 一个文件 = 一章内容
- 头文件(.h) = 目录(告诉别人这章有什么)
- 源文件(.c) = 具体内容

好处:
✅ 代码分类清晰
✅ 多人协作方便
✅ 修改一个文件不影响其他文件
✅ 可以重复使用代码

(2)实战案例:数学工具库

第一步:创建头文件 math_utils.h

c 复制代码
// math_utils.h - 数学工具的"目录"
// 作用:告诉别人"我这里有哪些函数可以用"

#ifndef MATH_UTILS_H    // 防止重复包含(很重要!)
#define MATH_UTILS_H    // 如果没有定义过,就定义它

// ========== 函数声明(接口) ==========
// 只告诉"有什么功能",不告诉"怎么实现"

/**
 * 计算两个整数的和
 * @param a 第一个整数
 * @param b 第二个整数
 * @return 两数之和
 */
int add(int a, int b);

/**
 * 计算两个整数的最大值
 * @param a 第一个整数
 * @param b 第二个整数
 * @return 较大的数
 */
int max(int a, int b);

/**
 * 计算数组的平均值
 * @param arr 整数数组
 * @param size 数组长度
 * @return 数组元素的平均值
 */
float average(int arr[], int size);

#endif  // 结束条件编译
// 这三行代码确保头文件只被包含一次,防止重复定义错误

第二步:创建源文件 math_utils.c

c 复制代码
// math_utils.c - 数学工具的"具体内容"
// 作用:实现头文件中声明的所有函数

#include "math_utils.h"  // 包含自己的头文件(用双引号)

// ========== 函数定义(实现) ==========

// 实现加法功能
int add(int a, int b) {
    return a + b;  // 简单直接
}

// 实现求最大值功能
int max(int a, int b) {
    // 三目运算符:条件 ? 真值 : 假值
    return (a > b) ? a : b;
  
    // 等价于:
    // if (a > b) {
    //     return a;
    // } else {
    //     return b;
    // }
}

// 实现求平均值功能
float average(int arr[], int size) {
    // 1. 检查输入是否合法
    if (size <= 0) {
        return 0.0f;  // 空数组返回0
    }
  
    // 2. 计算所有元素的和
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];  // 累加每个元素
    }
  
    // 3. 计算平均值(注意类型转换)
    return (float)sum / size;  // 强制转换为浮点数
}

第三步:创建主程序 main.c

c 复制代码
// main.c - 主程序
// 作用:使用我们创建的工具

#include <stdio.h>
#include "math_utils.h"  // 包含我们自己的头文件

int main() {
    printf("========== 数学工具测试 ==========\n\n");
  
    // 测试1:加法
    int a = 15, b = 27;
    printf("测试加法:%d + %d = %d\n", a, b, add(a, b));
  
    // 测试2:求最大值
    printf("测试最大值:max(%d, %d) = %d\n", a, b, max(a, b));
  
    // 测试3:求平均值
    int scores[] = {85, 92, 78, 95, 88};  // 成绩数组
    int count = 5;
    float avg = average(scores, count);
    printf("测试平均值:[85, 92, 78, 95, 88] 的平均值 = %.2f\n", avg);
  
    // 测试4:嵌套调用(函数里调用函数)
    int x = 10, y = 20, z = 30;
    int maxOfTwo = max(x, y);           // 先求x和y的最大值
    int maxOfThree = max(maxOfTwo, z);  // 再和z比较
    printf("测试嵌套:max(%d, %d, %d) = %d\n", x, y, z, maxOfThree);
  
    return 0;
}

/* 输出结果:
========== 数学工具测试 ==========

测试加法:15 + 27 = 42
测试最大值:max(15, 27) = 27
测试平均值:[85, 92, 78, 95, 88] 的平均值 = 87.60
测试嵌套:max(10, 20, 30) = 30
*/

(3)编译多文件程序

c 复制代码
# 方法1:一次性编译所有文件
gcc main.c math_utils.c -o program

# 方法2:分步编译(大型项目推荐)
gcc -c main.c -o main.o          # 编译main.c生成目标文件
gcc -c math_utils.c -o math_utils.o  # 编译math_utils.c
gcc main.o math_utils.o -o program   # 链接所有目标文件

# 运行程序
./program

(4)头文件保护的重要性

c 复制代码
// 为什么需要 #ifndef #define #endif?

// 假设没有保护:
// file1.c
#include "math_utils.h"  // 包含一次
#include "math_utils.h"  // 又包含一次

// 结果:所有函数声明了两遍,编译错误!

// 有了保护:
// 第一次包含:#ifndef 为真,定义 MATH_UTILS_H,包含内容
// 第二次包含:#ifndef 为假(已定义),跳过内容
// 完美!避免了重复定义

七、外部变量与全局变量🌍

(1)全局变量 vs 局部变量

c 复制代码
#include <stdio.h>

// 全局变量:在所有函数外面定义
int globalVar = 100;  // 所有函数都能访问

void func1() {
    printf("func1访问全局变量:%d\n", globalVar);
    globalVar = 200;  // 修改全局变量
}

void func2() {
    printf("func2看到修改后的值:%d\n", globalVar);
}

int main() {
    // 局部变量:只在main函数内有效
    int localVar = 10;  // 其他函数看不到这个变量
  
    printf("初始全局变量:%d\n", globalVar);
    func1();  // 修改全局变量
    func2();  // 看到修改后的值
  
    return 0;
}

/* 输出:
初始全局变量:100
func1访问全局变量:100
func2看到修改后的值:200
*/

(2)跨文件共享变量(extern)

文件1:config.c

c 复制代码
// config.c - 定义配置变量
int maxUsers = 100;       // 最大用户数
float version = 1.5f;     // 软件版本
char appName[] = "MyApp"; // 应用名称

文件2:utils.c

c 复制代码
// utils.c - 使用配置变量
#include <stdio.h>

// 声明外部变量(告诉编译器:这个变量在别的文件里定义了)
extern int maxUsers;
extern float version;
extern char appName[];

void showConfig() {
    printf("应用名称:%s\n", appName);
    printf("版本号:%.1f\n", version);
    printf("最大用户数:%d\n", maxUsers);
}

文件3:main.c

c 复制代码
// main.c - 主程序
#include <stdio.h>

extern int maxUsers;  // 声明外部变量
void showConfig();    // 声明函数

int main() {
    showConfig();  // 显示配置
  
    // 修改外部变量
    maxUsers = 200;
    printf("修改后:\n");
    showConfig();
  
    return 0;
}

⚠️ 注意事项:

c 复制代码
// 定义(只能有一次):分配内存
int globalVar = 10;

// 声明(可以多次):告诉编译器变量存在
extern int globalVar;

// 常见错误:
extern int errorVar = 10;  // ❌ extern不能初始化

八、函数高级应用🚀

(1)函数作为参数

c 复制代码
#include <stdio.h>

// 定义一个简单的数学运算函数类型
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }

// 高阶函数:接收函数作为参数
// operation 是一个函数指针,指向接收两个int返回int的函数
int calculate(int x, int y, int (*operation)(int, int)) {
    return operation(x, y);  // 调用传入的函数
}

int main() {
    int a = 10, b = 5;
  
    // 传入不同的函数,实现不同的计算
    printf("%d + %d = %d\n", a, b, calculate(a, b, add));
    printf("%d × %d = %d\n", a, b, calculate(a, b, multiply));
  
    return 0;
}

(2)递归的经典应用:斐波那契数列

c 复制代码
#include <stdio.h>

// 斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21...
// 规律:当前数 = 前两个数之和
int fibonacci(int n) {
    // 终止条件
    if (n == 1 || n == 2) {
        return 1;
    }
  
    // 递归:F(n) = F(n-1) + F(n-2)
    return fibonacci(n - 1) + fibonacci(n - 2);
}

int main() {
    printf("斐波那契数列前10项:\n");
    for (int i = 1; i <= 10; i++) {
        printf("F(%d) = %d\n", i, fibonacci(i));
    }
  
    return 0;
}

/* 输出:
F(1) = 1
F(2) = 1
F(3) = 2
F(4) = 3
F(5) = 5
F(6) = 8
F(7) = 13
F(8) = 21
F(9) = 34
F(10) = 55
*/

九、常见错误与调试技巧🔧

(1)常见错误

c 复制代码
// 错误1:忘记return
int getNumber() {
    int num = 10;
    // ❌ 忘记写 return num;
}  // 编译警告:函数应该返回值

// 错误2:类型不匹配
float divide(int a, int b) {
    return a / b;  // ❌ 整数除法,结果丢失小数
}
// 正确:return (float)a / b;

// 错误3:数组越界
int arr[5] = {1, 2, 3, 4, 5};
arr[10] = 100;  // ❌ 数组只有5个元素,访问第11个会崩溃

// 错误4:局部变量未初始化
void test() {
    int x;  // ❌ 没有初始化
    x = x + 1;  // 结果不可预测!
}

9.2 调试技巧

c 复制代码
#include <stdio.h>

// 技巧1:打印中间结果
int factorial(int n) {
    printf("计算 %d! \n", n);  // 调试输出
  
    if (n <= 1) {
        printf("返回 1\n");
        return 1;
    }
  
    int result = n * factorial(n - 1);
    printf("%d! = %d\n", n, result);  // 查看每一步的结果
    return result;
}

// 技巧2:断言检查
#include <assert.h>

float divide(float a, float b) {
    assert(b != 0);  // 如果b为0,程序会停止并报错
    return a / b;
}

// 技巧3:使用调试宏
#define DEBUG 1  // 开发时设为1,发布时设为0

#if DEBUG
    #define LOG(msg) printf("[DEBUG] %s\n", msg)
#else
    #define LOG(msg)  // 什么都不做
#endif

int main() {
    LOG("程序开始");
    // ... 你的代码 ...
    LOG("程序结束");
    return 0;
}

十、总结与建议📝

(1)核心要点回顾

函数三要素 :返回值类型、函数名、参数列表

值传递 vs 指针传递 :值传递改不了原变量,指针传递可以

递归必须有终止条件 :否则会栈溢出(程序崩溃)

函数声明和定义 :先声明(告知存在),后定义(具体实现)

多文件编程 :.h文件声明,.c文件实现,用#ifndef防止重复包含

变量作用域:局部变量只在函数内有效,全局变量要慎用

(2)学习建议

  1. 从简单开始:先写无参数无返回值的函数,再逐步加参数和返回值
  2. 多动手练习:看懂≠会写,必须自己敲代码
  3. 画图理解指针:用箭头画出变量和地址的关系
  4. 调试是好习惯:多用printf查看中间结果
  5. 阅读优秀代码:GitHub上有很多C语言项目可以学习

(3)💬 结语

恭喜你读完了这篇长文!函数是C语言的灵魂,掌握好函数,你就能写出结构清晰、易于维护的程序。

记住:编程是一门手艺活,只有多练才能熟能生巧。遇到bug不要慌,学会调试和查资料,每个程序员都是从无数bug中成长起来的!

如果这篇文章对你有帮助,别忘了点赞👍、收藏⭐、关注我,后续还会更新更多C语言教程!

有任何问题欢迎在评论区留言,我会尽快回复~

相关推荐
Xの哲學3 小时前
Linux ioctl 深度剖析:从原理到实践
linux·网络·算法·架构·边缘计算
隐语SecretFlow3 小时前
隐语SecreFlow:如何全面提升MPC多方安全学习的性能?
算法
凌然先生3 小时前
12.如何利用ArcGIS进行基本的空间数据格式转换
经验分享·笔记·arcgis·电脑
王国强20093 小时前
什么是算法复杂度?
算法
夏鹏今天学习了吗3 小时前
【LeetCode热题100(54/100)】全排列
算法·leetcode·深度优先
緈福的街口3 小时前
gps的定位图,在车的位置去寻找周围20x20的区域,怎么确定周围有多少辆车,使用什么数据结构
数据结构·算法
学工科的皮皮志^_^3 小时前
PCIE学习
经验分享·嵌入式硬件·学习·fpga开发·pcie
Autism1144 小时前
javase-day22-stream
java·开发语言·windows·笔记
江塘4 小时前
机器学习-KNN算法实战及模型评估可视化(C++/Python实现)
开发语言·c++·人工智能·python·算法·机器学习