C语言从0入门(八)|函数基础:封装、调用与参数传递精讲

大家好,我是网域小星球。

在前面的学习中,我们实现的所有功能代码都写在 main 函数内部。随着程序功能越来越多,代码会变得冗长、结构混乱,重复代码大量出现,阅读和维护都非常困难。

C语言中的函数,就是用来解决这一问题的核心机制。它可以把一段具有独立功能的代码封装起来,实现一次编写、多次调用,让程序结构更清晰、更易维护,是模块化程序设计的基础,也是从入门到进阶的关键一步。

本篇从函数的原理、语法规范、调用流程到经典案例完整展开,全程适配VS2022,代码可直接编译运行,知识点系统且实用,零基础也能轻松吃透。

目录

一、本章学习目标

二、函数的基本概念

[1. 什么是函数?](#1. 什么是函数?)

[2. 使用函数的核心好处](#2. 使用函数的核心好处)

[3. C语言函数的分类(入门重点)](#3. C语言函数的分类(入门重点))

三、函数的标准语法结构

各部分详细说明

四、函数的定义、声明与调用(核心流程)

[1. 函数声明](#1. 函数声明)

[2. 函数定义](#2. 函数定义)

[3. 函数调用](#3. 函数调用)

五、形参与实参的核心区别(新手必懂)

六、经典案例(函数封装实战)

案例1:封装无参无返回值函数------打印菜单

案例2:封装有参有返回值函数------判断奇偶数

案例3:封装多参数函数------求三个数的最大值

案例4:多函数协作------综合实战(输入、计算、输出分离)

七、新手高频易错点(避坑指南)

八、本章核心总结

下期预告

一、本章学习目标

学完本篇你将彻底掌握:

  1. 函数的核心意义与使用价值

  2. 函数的标准定义、声明、调用完整流程

  3. 形参与实参的区别及传递规则

  4. 无参函数、有参函数、空返回值函数的写法

  5. 函数返回值的使用规范与注意事项

  6. 封装常用功能(求和、判断、最值)的函数

  7. 多函数程序的结构规范与调试方法


二、函数的基本概念

1. 什么是函数?

函数是完成特定独立功能的代码块,有明确的输入(参数)和输出(返回值),被封装后可重复调用。

类比:函数就像一个"工具"------比如计算器,输入两个数字(参数),它处理后输出计算结果(返回值),每次需要计算时,直接使用这个工具即可,无需重新造一个计算器。

2. 使用函数的核心好处

  • 代码复用:一次封装,多次调用,避免重复编写相同功能的代码(比如多次求两个数的和,无需重复写求和语句)。

  • 模块化编程:将复杂程序拆分为多个小功能函数,结构清晰,便于阅读、调试和维护(比如一个程序拆分为"输入""计算""输出"三个函数)。

  • 分工协作:大型项目开发时,多人可分别负责不同功能的函数,提高开发效率。

  • 降低耦合:各函数独立运行,某一个函数出错,只需修改该函数,不影响其他功能的代码。

3. C语言函数的分类(入门重点)

  • 按参数划分:无参函数、有参函数

  • 按返回值划分:有返回值函数、空返回值函数(void)

  • 按来源划分:库函数(系统自带,如printf、scanf)、自定义函数(自己编写)

注意:C程序的入口永远是 main 函数,所有其他函数都由 main 函数或其他函数调用执行,main 函数不能被其他函数调用。


三、函数的标准语法结构

无论哪种函数,定义时都遵循固定格式,缺一不可:

cpp 复制代码
// 函数定义格式
返回值类型 函数名(参数列表)
{
    // 函数体:实现具体功能的代码
    语句1;
    语句2;
    ...
    
    // 返回值(有返回值函数必须写return)
    return 返回值;
}

各部分详细说明

  1. 返回值类型:函数执行完毕后,返回给调用者的数据类型。

    1. 有返回值:可写int、char、double等(如求和函数返回int类型)。

    2. 无返回值:用 void 表示(如只打印内容的函数,无需返回结果)。

  2. 函数名:函数的标识,遵循变量命名规则(字母、数字、下划线组成,不数字开头、不使用关键字),建议见名知意(如求和函数叫sum,判断奇偶数叫isOdd)。

  3. 参数列表:函数的输入数据,也叫形参(形式参数)。

    1. 无参函数:括号内为空或写 void(如 void printInfo())。

    2. 有参函数:括号内写参数类型+参数名,多个参数用逗号分隔(如 int sum(int a, int b))。

  4. 函数体:用大括号包裹,实现函数具体功能的代码,遵循顺序、分支、循环结构。

  5. return语句

    1. 有返回值函数:必须写return,返回值类型要与函数定义的返回值类型一致。

    2. 无返回值函数(void):可省略return,或只写 return;(用于提前结束函数)。


四、函数的定义、声明与调用(核心流程)

一个完整的函数使用流程:声明 → 定义 → 调用,三者缺一不可,新手常遗漏"声明"步骤导致报错。

1. 函数声明

作用:告诉编译器"有这个函数",说明函数的返回值类型、函数名和参数列表,让编译器识别函数,避免报错。

语法格式(简化版,末尾加分号):

cpp 复制代码
返回值类型 函数名(参数列表);

示例:

cpp 复制代码
// 声明一个求和函数,返回int类型,接收两个int参数
int sum(int a, int b);

// 声明一个无参、无返回值的打印函数
void printWelcome();

注意:函数声明可写在 main 函数之前,也可写在 main 函数内部(需在调用前声明)。

2. 函数定义

就是编写函数的具体实现,即函数体内容,定义时必须与声明的返回值类型、函数名、参数列表完全一致。

示例(对应上面的声明):

cpp 复制代码
// 定义求和函数,实现两个数相加
int sum(int a, int b)
{
    int result = a + b;
    return result; // 返回求和结果
}

// 定义打印欢迎信息的函数
void printWelcome()
{
    printf("欢迎学习C语言函数!\n");
    // 无返回值,可省略return
}

3. 函数调用

作用:执行函数中的代码,获取函数返回值(有返回值时)。

语法格式:

cpp 复制代码
// 无参函数调用
函数名();

// 有参函数调用,传入实际参数(实参)
函数名(实参1, 实参2, ...);

// 有返回值函数,可将返回值赋值给变量
变量 = 函数名(实参1, 实参2, ...);

完整示例(VS2022可直接运行):

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

// 1. 函数声明
int sum(int a, int b);
void printWelcome();

// 主函数(程序入口)
int main()
{
    // 2. 函数调用
    printWelcome();
    
    int x = 10, y = 20;
    int s = sum(x, y); // 调用求和函数,接收返回值
    printf("%d + %d = %d\n", x, y, s);
    
    return 0;
}

// 3. 函数定义
int sum(int a, int b)
{
    return a + b; // 简化写法,无需临时变量
}

void printWelcome()
{
    printf("====================\n");
    printf("  C语言函数入门实战  \n");
    printf("====================\n");
}

运行结果:

cpp 复制代码
====================
  C语言函数入门实战  
====================
10 + 20 = 30

五、形参与实参的核心区别(新手必懂)

很多新手会混淆形参(形式参数)和实参(实际参数),两者的区别的关键的是"是否占用内存""是否传递值"。

对比项 形式参数(形参) 实际参数(实参)
位置 函数定义、声明的括号内 函数调用的括号内
本质 临时变量,只有函数调用时才占用内存 具体的值(变量、常量),本身已占用内存
关系 接收实参传递的值(单向传递:实参→形参) 将值传递给形参,不影响自身的值
要求 必须写类型+变量名 类型、个数必须与形参一致

示例说明:

cpp 复制代码
int sum(int a, int b) // a、b 是形参(临时变量)
{
    a++; // 修改形参的值,不影响实参
    return a + b;
}

int main()
{
    int x = 10, y = 20;
    int s = sum(x, y); // x、y 是实参(具体变量)
    printf("x = %d, y = %d\n", x, y); // 输出 x=10, y=20(实参未变)
    return 0;
}

六、经典案例(函数封装实战)

下面通过4个经典案例,掌握不同类型函数的封装与调用,全部可在VS2022运行。

案例1:封装无参无返回值函数------打印菜单

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

// 声明函数
void printMenu();

int main()
{
    printMenu(); // 调用函数
    return 0;
}

// 定义函数:打印简易菜单
void printMenu()
{
    printf("========== 菜单 ==========\n");
    printf("1. 求和\n");
    printf("2. 求最大值\n");
    printf("3. 判断奇偶数\n");
    printf("4. 退出\n");
    printf("==========================\n");
}

案例2:封装有参有返回值函数------判断奇偶数

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

// 声明函数:接收一个int参数,返回int(1=奇数,0=偶数)
int isOdd(int num);

int main()
{
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    
    if (isOdd(n) == 1)
    {
        printf("%d 是奇数\n", n);
    }
    else
    {
        printf("%d 是偶数\n", n);
    }
    return 0;
}

// 定义函数:判断奇偶数
int isOdd(int num)
{
    if (num % 2 != 0)
    {
        return 1; // 奇数返回1
    }
    else
    {
        return 0; // 偶数返回0
    }
}

案例3:封装多参数函数------求三个数的最大值

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

// 声明函数:接收三个int参数,返回最大值
int getMax(int a, int b, int c);

int main()
{
    int x, y, z;
    printf("请输入三个整数:");
    scanf("%d %d %d", &x, &y, &z);
    
    int max = getMax(x, y, z);
    printf("三个数的最大值是:%d\n", max);
    return 0;
}

// 定义函数:求三个数的最大值
int getMax(int a, int b, int c)
{
    int max = a;
    if (b > max) max = b;
    if (c > max) max = c;
    return max;
}

案例4:多函数协作------综合实战(输入、计算、输出分离)

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

// 声明三个函数
void inputNum(int *a, int *b); // 输入两个数(后续会学指针,此处直接用)
int sum(int a, int b);        // 求和
void printResult(int a, int b, int s); // 打印结果

int main()
{
    int x, y, s;
    inputNum(&x, &y); // 调用输入函数
    s = sum(x, y);     // 调用求和函数
    printResult(x, y, s); // 调用打印函数
    return 0;
}

// 定义输入函数:接收两个数
void inputNum(int *a, int *b)
{
    printf("请输入两个整数:");
    scanf("%d %d", a, b);
}

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

// 定义打印函数
void printResult(int a, int b, int s)
{
    printf("%d + %d = %d\n", a, b, s);
}

七、新手高频易错点(避坑指南)

  1. 遗漏函数声明:函数定义在 main 函数之后,未提前声明,导致编译器报错"未定义标识符"。

  2. 形参与实参不匹配:参数个数、类型不一致(如形参是int,实参传char),导致编译错误或运行结果异常。

  3. 无返回值函数写return:void类型函数,不能return具体值(可写 return;)。

  4. 有返回值函数未写return:或return的值类型与函数定义的返回值类型不一致(如函数返回int,却return 3.14)。

  5. 函数调用时加括号:无参函数调用必须写printWelcome();,不能写 printWelcome;(后者是函数地址,不执行函数)。

  6. 修改形参影响实参:误以为形参和实参是同一个变量,修改形参后期待实参也变化(实际是单向值传递,不影响实参)。


八、本章核心总结

  1. 函数是封装独立功能的代码块,核心价值是代码复用和模块化编程。

  2. 函数使用完整流程:声明 → 定义 → 调用,三者必须一致(返回值、函数名、参数)。

  3. 形参是临时变量,实参是具体值,传递方向是"实参→形参",修改形参不影响实参。

  4. void函数无返回值,有返回值函数必须写return,且类型一致。

  5. 函数封装的关键:一个函数只做一件事,见名知意,便于维护和调用。


下期预告

下一篇我们将深入函数进阶内容,学习函数嵌套调用(函数内部调用其他函数)、递归函数的基础用法,理解变量的作用域(局部变量、全局变量),解决更复杂的编程问题,进一步提升代码的模块化和灵活性,全程VS2022实战精讲。

相关推荐
东宇科技2 小时前
如何使用js进行抠图。识别商品主体
开发语言·javascript·ecmascript
Dxy12393102162 小时前
Python使用PyEnchant详解:打造高效拼写检查工具
开发语言·python
网域小星球2 小时前
C语言从0入门(十)|二维数组详解与矩阵实战
c语言·算法·矩阵·二维数组·数组遍历
网域小星球2 小时前
C 语言从 0 入门(十五)|综合小项目:菜单交互与简易功能实现
c语言·开发语言·交互
网域小星球2 小时前
C 语言从 0 入门(十六)|动态内存管理:malloc /free/calloc /realloc 精讲
c语言·开发语言·free·malloc·动态内存
雪的季节3 小时前
qt信号槽跨线程使用时候的坑
java·开发语言·qt
AI应用实战 | RE3 小时前
011、向量数据库入门:Embeddings原理与ChromaDB实战
开发语言·数据库·langchain·php
chh5633 小时前
C++--内存管理
java·c语言·c++·windows·学习·面试
一直不明飞行3 小时前
C++:string,写法s.find(‘@‘) != s.end()是否有问题
开发语言·c++·算法