【C语言入门学习】函数的概念

前言

在数学中,函数是核心思想之一;同样,在计算机语言中,函数也是编程的核心思想。函数通过将代码结构化,帮助我们简化复杂的程序逻辑。


一、函数的定义

根据维基百科的定义:子程序,子程序是计算机程序中负责完成某项特定任务的一段代码。它由一个或多个语句块组成,相较于其他代码,具备较高的独立性。子程序通常有输入参数和返回值,提供过程的封装与细节的隐藏,且多被集成为软件库中的函数。


二、函数的分类

  • 库函数
  • 自定义函数

为什么需要库函数?

C语言的标准库中提供了大量的库函数,旨在减少重复编写常用功能的代码,避免重复造轮子。库函数帮助我们高效地解决常见问题,提高开发效率。

如何查找库函数?

以下是常用的库函数查询网站:

提示:cppreference 支持在 Edge 浏览器中安装插件,URL 搜索框中输入 “cc”+“空格” 可以快速查询函数的定义、使用方式及对应的封装库。

常见的库函数

  • IO函数:如 printfscanf
  • 字符串操作函数:如 strlen
  • 字符操作函数
  • 内存操作函数
  • 时间/日期函数
  • 数学函数
  • 其他库函数

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main1() {
// 库函数的应用示例
char arr1[20] = {0};
char arr2[] = "hello world";

// 字符串拷贝
strcpy(arr1, arr2);
printf("%s\n", arr1);

// 设置内存块
memset(arr1, 'x', 5);
printf("%s\n", arr1);

return 0;
}

在C语言中,库函数的使用需要通过 #include 指令包含相应的头文件:

  • #include < >:用于引用标准库头文件,路径指向编译器的标准库目录。
  • #include " ":用于引用自定义头文件,路径指向工程目录。

三、自定义函数

编写自定义函数可以根据具体需求设计功能,增强代码的灵活性,提升代码重用率和可读性。

函数的基本结构:

1
2
3
4
返回值类型 函数名(形参列表) {
// 函数体
return 返回值; // 如需要返回值
}

示例1:找出两个数中的最大值

1
2
3
4
5
6
7
8
int get_max(int x, int y) {
int z = 0;
if (x > y)
z = x;
else
z = y;
return z; // 返回最大值z
}

示例2:交换两个数的值

Swap1:不通过指针交换值

1
2
3
4
5
void Swap1(int x, int y) {
int temp = x;
x = y;
y = temp;
}

Swap2:通过指针交换值

1
2
3
4
5
void Swap2(int* pa, int* pb) {
int temp = *pa; // 解引用,获取pa指向的值
*pa = *pb; // 交换两者的值
*pb = temp;
}

主函数示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main() {
int a = 10;
int b = 20;

// 使用get_max函数获取最大值
int max = get_max(a, b);
printf("%d\n", max); // 输出最大值

// 交换两个整型变量的值
printf("交换前:a=%d b=%d\n", a, b);
Swap1(a, b); // 形参不影响实参
printf("交换后:a=%d b=%d\n", a, b); // 无法交换成功

int* pa = &a; // pa是指向a的指针
*pa = 15; // 通过指针修改a的值
printf("%d\n", a); // 输出修改后的a

printf("交换前:a=%d b=%d\n", a, b);
Swap2(&a, &b); // 通过指针传递,交换值
printf("交换后:a=%d b=%d\n", a, b); // 成功交换

return 0;
}

示例1 运行结果

1
20

解释get_max 函数正确返回了较大的数。


示例2 运行结果1

1
2
交换前:a=10 b=20
交换后:a=10 b=20

问题分析

  • Swap1 函数无法成功交换两个变量的值,因为传递给函数的实参被复制为形参,函数内部修改的仅是形参,不会影响原实参。

示例2 运行结果2

1
2
3
15
交换前:a=15 b=20
交换后:a=20 b=15

问题解决

  • Swap2 函数通过指针操作了实参的内存地址,从而实现了变量交换。指针使得函数可以直接操作变量的值,而不是操作拷贝的形参。

板书总结


总结

  1. 掌握库函数:养成查阅库函数文档的习惯,学会利用工具来提高编程效率。
  2. 理解形参与实参的区别:函数中的形参是实参的拷贝,改变形参不会影响实参,除非通过指针传递内存地址。
  3. 学会自定义函数:通过定义自定义函数,编写更加灵活和可维护的代码。