C语言(5)—函数
文章目录
- 一、函数的基本概念
- 1.1 什么是函数
- 1.2 为什么需要函数
- 1.3 函数的分类
- 二、库函数的使用
- 2.1 常用库函数示例
- 三、自定义函数
- 3.1 函数定义语法
- 四、函数参数详解
- 4.1 形参和实参
- 4.2 数组作为函数参数
- 五、函数的返回值
- 5.1 return语句注意事项
- 5.2 多返回值实现技巧
- 六、函数的嵌套调用与链式访问
- 6.1 嵌套调用
- 6.2 链式访问
- 七、函数声明与多文件编程
- 7.1 函数声明
- 7.2 多文件组织
- 八、static和extern关键字
- 8.1 static修饰局部变量
- 8.2 static修饰全局变量和函数
- 九、总结
一、函数的基本概念
1.1 什么是函数
函数是一段完成特定任务的独立代码块,具有以下特点:
可以接收输入参数(也可以没有)可以返回一个值(也可以不返回)可以被多次调用实现了代码的复用和模块化
1.2 为什么需要函数
代码复用:避免重复编写相同功能的代码模块化设计:将复杂问题分解为多个小问题提高可读性:通过有意义的函数名使代码更易理解便于维护:修改功能只需修改对应函数
1.3 函数的分类
C语言中函数主要分为两类:
库函数:由C标准库提供的现成函数(如printf、scanf)自定义函数:程序员根据需求自己编写的函数
二、库函数的使用
2.1 常用库函数示例
#include <stdio.h>
#include <math.h> // 数学函数头文件int main() {double x = 16.0;double root = sqrt(x); // 计算平方根printf("平方根: %.2f\n", root);return 0;
}
#include <stdio.h>
#include <string.h> // 字符串函数头文件int main() {char str1[20] = "Hello";char str2[] = "World";strcat(str1, str2); // 字符串连接printf("连接结果: %s\n", str1);printf("字符串长度: %zu\n", strlen(str1));return 0;
}
三、自定义函数
3.1 函数定义语法
返回类型 函数名(参数列表) {// 函数体return 返回值;
}
#include <stdio.h>// 返回1表示闰年,0表示非闰年
int IsLeapYear(int year) {if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))return 1;elsereturn 0;
}int main() {int year;printf("请输入年份: ");scanf("%d", &year);if (IsLeapYear(year))printf("%d年是闰年\n", year);elseprintf("%d年不是闰年\n", year);return 0;
}
四、函数参数详解
4.1 形参和实参
形参(形式参数):函数定义时括号中的参数实参(实际参数):函数调用时传递给函数的实际值
#include <stdio.h>// x和y是形参
void Swap(int x, int y) {int temp = x;x = y;y = temp;printf("函数内: x=%d, y=%d\n", x, y);
}int main() {int a = 10, b = 20;// a和b是实参Swap(a, b);printf("函数外: a=%d, b=%d\n", a, b);return 0;
}
4.2 数组作为函数参数
#include <stdio.h>// 参数可以写成int arr[]或int* arr
void PrintArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}void ModifyArray(int arr[], int size) {for (int i = 0; i < size; i++) {arr[i] *= 2; // 修改数组元素}
}int main() {int nums[] = {1, 2, 3, 4, 5};int size = sizeof(nums) / sizeof(nums[0]);PrintArray(nums, size);ModifyArray(nums, size);PrintArray(nums, size);return 0;
}
五、函数的返回值
5.1 return语句注意事项
5.2 多返回值实现技巧
void GetMinMax(int arr[], int size, int* min, int* max) {*min = *max = arr[0];for (int i = 1; i < size; i++) {if (arr[i] < *min) *min = arr[i];if (arr[i] > *max) *max = arr[i];}
}
typedef struct {int min;int max;
} MinMax;MinMax GetMinMax(int arr[], int size) {MinMax res;res.min = res.max = arr[0];// ...计算过程return res;
}
六、函数的嵌套调用与链式访问
6.1 嵌套调用
#include <stdio.h>int IsLeapYear(int year) {return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}int GetDaysOfMonth(int year, int month) {int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int day = days[month];if (month == 2 && IsLeapYear(year))day++;return day;
}int main() {int year, month;printf("请输入年份和月份: ");scanf("%d %d", &year, &month);printf("%d年%d月有%d天\n", year, month, GetDaysOfMonth(year, month));return 0;
}
6.2 链式访问
#include <stdio.h>
#include <string.h>int main() {// 常规方式int len = strlen("Hello");printf("%d\n", len);// 链式访问printf("%d\n", strlen("Hello"));// 复杂链式printf("%d\n", printf("%d ", printf("Hello!")));// 输出: Hello!6 7// 第一个printf输出Hello!并返回6(字符数)// 第二个printf输出6 并返回2(6和空格)// 第三个printf输出2return 0;
}
七、函数声明与多文件编程
7.1 函数声明
// 函数声明
int Add(int a, int b);int main() {int result = Add(3, 4); // 函数调用printf("%d\n", result);return 0;
}// 函数定义
int Add(int a, int b) {return a + b;
}
7.2 多文件组织
八、static和extern关键字
8.1 static修饰局部变量
#include <stdio.h>void Counter() {static int count = 0; // 只初始化一次count++;printf("调用次数: %d\n", count);
}int main() {for (int i = 0; i < 5; i++) {Counter();}return 0;
}
8.2 static修饰全局变量和函数
static int hiddenVar = 42; // 只能在file1.c中使用static void HiddenFunc() { // 只能在file1.c中调用printf("这是一个隐藏函数\n");
}
九、总结
本文全面介绍了C语言函数的相关知识,包括:
函数的基本概念和分类库函数的使用方法自定义函数的定义和调用函数参数传递机制函数的返回值嵌套调用和链式访问函数声明和多文件编程static和extern关键字递归函数函数指针可变参数函数
掌握这些知识后,您将能够:
编写结构清晰、模块化的C程序合理组织大型项目的代码结构实现复杂的算法和功能提高代码的复用性和可维护性
建议通过实际编程练习来巩固这些概念,例如尝试实现各种排序算法、数学计算函数等,逐步提升对函数的理解和运用能力。