当前位置: 首页 > web >正文

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程序合理组织大型项目的代码结构实现复杂的算法和功能提高代码的复用性和可维护性

建议通过实际编程练习来巩固这些概念,例如尝试实现各种排序算法、数学计算函数等,逐步提升对函数的理解和运用能力。

http://www.xdnf.cn/news/2928.html

相关文章:

  • 计算机毕业设计--基于深度学习(U-Net与多尺度ViT)的车牌模糊图像修复算法设计与实现(含Github代码+Web端在线体验界面)
  • 大模型在肾癌诊疗全流程中的应用研究报告
  • transformer-实现单层Decoder 层
  • iOS签名的包支持推送功能吗?
  • Windows 桌面个性高效组件工具
  • 常用回环检测算法对比(SLAM)
  • 当向量数据库与云计算相遇:AI应用全面提速
  • 逆传播AIGEO营销:破局生成式搜索时代,让AI成为品牌代言人!
  • Go语言中的 `time.Tick` 函数详解
  • Qwen3简介:大型语言模型的革命
  • 数据库中常用的窗口函数
  • 第十六届蓝桥杯 2025 C/C++B组 第二轮省赛 全部题解(未完结)
  • k8s术语master,node,namepace,LABLE
  • std::unique_ptr的get方法
  • Prometheus使用Recoding Rules优化性能
  • antd+react实现html图片预览效果
  • 人事管理系统6
  • react-native 安卓APK打包流程
  • 【Linux学习笔记】进程替换和自定义shell
  • 自动化立库/AGV物流仿真详细步骤
  • MarkItDown:如何高效将各类文档转换为适合 LLM 处理的 Markdown 格式
  • Objective-C Block 底层原理深度解析
  • Hearts of Iron IV 钢铁雄心 4 [DLC 解锁] [Windows SteamOS macOS]
  • 基于tabula对pdf中多个excel进行识别并转换成word中的优化(四)
  • 防爆风扇储能轴流风机风量风压如何保障通风安全?
  • dify1.3.1更新又给我们带来了什么?
  • 已知条件概率,反推设计值
  • Vue3取消网络请求的方法(AbortController)
  • android开发中的多线程、数据存储同步功能实现方案和应用场景
  • 【SpringBoot】基于MybatisPlus的博客管理系统(1)