逍遥自在学C语言 | 函数初级到高级解析
前言
函数是C语言中的基本构建块之一,它允许我们将代码组织成可重用、模块化的单元。
本文将逐步介绍C语言函数的基础概念、参数传递、返回值、递归以及内联函数和匿名函数。
一、人物简介
- 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。

- 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。

二、基础概念
函数是一个独立的代码块,可以接收输入参数并执行特定任务。
它可以用于执行特定的操作或计算,并可以返回一个值(可选)。
以下是一个简单的示例:
#include <stdio.h>
// 声明函数
int addNumbers(int a, int b) {
int sum = a + b;
return sum;
}
int main() {
// 调用函数
int result = addNumbers(3, 4);
printf("两数之和:%d\n", result);
return 0;
}
上述代码中,我们声明了一个名为
addNumbers的函数,它接收两个整数参数并返回它们的和。在
main函数中,我们调用了addNumbers函数,并将结果打印到控制台上。运行结果
两数之和:7
三、参数传递
- 函数可以通过参数接收外部传入的数据。
- 在C语言中,有两种参数传递的方式:按值传递和按引用传递。
- 代码示例
#include <stdio.h>
// 按值传递
void incrementByValue(int num) {
num += 1;
}
// 按引用传递
void incrementByReference(int* numPtr) {
(*numPtr) += 1;
}
int main() {
int num = 5;
incrementByValue(num);
printf("按值传递后的值:%d\n", num);
incrementByReference(&num);
printf("按引用传递后的值:%d\n", num);
return 0;
}
在上面的示例中,我们定义了两个函数
incrementByValue和incrementByReference。incrementByValue按值传递参数,即在函数内部对参数的修改不会影响到原始变量。而
incrementByReference按引用传递参数,通过传递指针的方式,可以在函数内部修改原始变量的值。运行结果
按值传递后的值:5
按引用传递后的值:6
四、返回值
函数可以返回一个值,这使得我们可以从函数中获取计算结果或执行状态。
#include <stdio.h>
// 返回两个数中较大的数
int max(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
}
int main() {
int a = 3;
int b = 4;
int maxValue = max(a, b);
printf("较大的数:%d\n", maxValue);
return 0;
}
在上述示例中,
max函数接收两个整数参数并返回较大的数。在
main函数中,我们调用max函数,并将结果打印到控制台上。运行结果
较大的数:4
五、递归函数
递归是一种函数调用自身的技术。
它在解决一些问题时非常有用,如计算阶乘、斐波那契数列等。
代码示例
#include <stdio.h>
// 计算阶乘
int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
int num = 5;
int result = factorial(num);
printf("%d的阶乘:%d\n", num, result);
return 0;
}
在上面的示例中,
factorial函数使用递归的方式计算一个数的阶乘。在
main函数中,我们调用factorial函数,并将结果打印到控制台上。运行结果
5的阶乘:120
六、内联函数
内联函数是一种函数调用的优化方式,编译器会将函数的代码直接嵌入到调用该函数的地方,而不是通过函数调用的方式进行执行。
内联函数的好处是可以减少函数调用的开销,提高程序的执行效率。
使用内联函数可以通过在函数定义前加上关键字
inline来标识。代码示例
#include <stdio.h>
// 内联函数
inline int square(int num) {
return num * num;
}
int main() {
int result = square(5);
printf("平方:%d\n", result);
return 0;
}
在上述示例中,我们定义了一个内联函数
square,它计算一个数的平方。在
main函数中,我们调用square函数,并将结果打印到控制台上。运行结果
平方:25
七、匿名函数
- C语言本身不直接支持匿名函数,但可以使用函数指针和函数指针结构体来模拟匿名函数的功能。
- 代码示例
#include <stdio.h>
// 匿名函数模拟
typedef int (*Operation)(int, int);
int performOperation(int a, int b, Operation op) {
return op(a, b);
}
int main() {
Operation add = [](int a, int b) {
return a + b;
};
int result = performOperation(3, 4, add);
printf("结果:%d\n", result);
return 0;
}
在上述示例中,我们使用函数指针结构体
Operation来模拟匿名函数。我们定义了一个匿名函数
add,它实现了两个数的加法运算。然后,我们将add函数作为参数传递给performOperation函数,并打印结果到控制台上。运行结果
结果:7
小结
通过这篇文章,我们学会了
1、函数的概念,参数传递,函数返回值
2、递归函数
3、内联函数
4、匿名函数
欢迎各位 点赞 收藏 评论,如有错误请留言指正,非常感谢!
逍遥自在学C语言 | 函数初级到高级解析的更多相关文章
- 逍遥自在学C语言 | 位运算符&的高级用法
前言 在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位 ...
- 逍遥自在学C语言 | 位运算符^的高级用法
前言 在上一篇文章中,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一 ...
- 逍遥自在学C语言 | 第一个C语言程序 九层之台起于垒土
一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.C语言简介 C语言是一种高级语言,运行效率仅次于汇编,支持跨平 ...
- 逍遥自在学C语言 位运算符 "|" 的5种高级用法
前言 在上一篇文章中,我们介绍了&运算符的高级用法,本篇文章,我们将介绍| 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是 ...
- 逍遥自在学C语言 | 变量、常量与数据类型
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.基本数据类型 1.整型 C语言中的整型数据如下表所示: ...
- 逍遥自在学C语言 | 算数运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.算数运算符简介 C语言的算数运算符,是用来完成基本的算术 ...
- 逍遥自在学C语言 | 位运算符的基础用法
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表达方式 位运算符是一组用于在二进制数之间进行操作 ...
- 逍遥自在学C语言 | 关系运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 关系运算符的作用是判断符号两边大小的关系 ...
- 逍遥自在学C语言 | 逻辑运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 逻辑运算符是用来比较和操作布尔值的运算符 ...
- 逍遥自在学C语言 | 赋值运算符
前言 在C语言中,赋值运算符用于将一个值赋给变量 这个过程分为两个步骤: 计算赋值运算符右侧的表达式 将结果赋给左侧的变量. C语言提供了多个不同的赋值运算符,包括基本的赋值运算符.复合赋值运算符以及 ...
随机推荐
- 理解String、StringBuilder和StringBuffer
1. String.StringBuilder和StringBuffer异同 相同点:底层都是通过char数组实现的 不同点: String对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空 ...
- 全网最详细中英文ChatGPT-GPT-4示例文档-食谱智能生成从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)
目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...
- Kubernetes学习之旅
# Kubernetes学习之旅 ## 引言 - 为什么选择Kubernetes- Kubernetes简介- Kubernetes的发展历程 ## Kubernetes基本概念 - 节点(Node) ...
- Redis 日志showlog 和 管道pileline
redis日志 slowlog-log-slower-than:指定执行时间超过多少微秒(1秒等于1000000微秒) 的命令请求会被记录到日志上 slowlog-max-len:指定服务器最多保存多 ...
- FreeSWITCH添加iLBC编码及转码
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 一.安装ilbc库 从第三方库里下载指定版本: git clone https://freeswitch.org/s ...
- ROS机器人校正
vROS机器人IMU自动校正 连接小车 注意:必须在同一区域网 ssh clbrobort@clbrobort 激活树莓派主板 roslaunch clbrobot bringup.launch 自动 ...
- 笔记:C++学习之旅---面向对象程序的设计1
笔记:C++学习之旅---面向对象程序的设计1 面向对象的主要特征 1.抽象 2.封装 3.继承 4.多态 抽象:将程序的每一部分都看作一个抽象的对象,即程序有一组抽象的对象组成的更复杂点,这些对象根 ...
- vue2路由导航守卫(钩子函数)
https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%85%A8%E5%B1%80%E5%89%8D%E7%BD% ...
- [C++基础入门] 6、 函数
文章目录 6 函数 6.1 概述 6.2 函数的定义 6.3 函数的调用 6.4 值传递 6.5 函数的常见样式 6.6 函数的声明 6.7 函数的分文件编写 6 函数 6.1 概述 **作用:**将 ...
- KMP算法学习笔记
总算把这个东西搞懂了...... KMP是一个求解字符串匹配问题的算法. 这个东西的核心是一个\(next\)数组,\(next_i\)表示字符串第\(0\sim i\)项的相同的前缀和后缀的最大长度 ...