逍遥自在学C语言 | 函数初级到高级解析

news2024/12/23 14:48:36

前言

函数是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;
}

  • 在上面的示例中,我们定义了两个函数incrementByValueincrementByReference

  • 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、匿名函数

📢欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,非常感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python用flask将视频显示在网页上

注意我们的return返回值必须是以下之一&#xff0c;否则会报错 from flask import Flask, render_template, Response import cv2app Flask(__name__)app.route(/) def index():return render_template(index.html)def gen(camera):while True:success, image camera.read(…

组装电脑U盘重装Win10系统教程图解

当您需要对组装电脑进行重新安装Win10操作系统时&#xff0c;使用U盘是一种方便而有效的方法&#xff0c;U盘重装系统不仅可以帮助您解决各种系统问题&#xff0c;还能提供一个干净、稳定的系统环境。无论您是初学者还是有一定经验的用户&#xff0c;本教程将提供清晰的组装电脑…

人机环境系统智能能够解决以巴冲突吗?

巴以冲突的由来可以追溯到19世纪末和20世纪初&#xff0c;当时巴勒斯坦是奥斯曼帝国的一部分&#xff0c;但随着第一次世界大战的爆发&#xff0c;奥斯曼帝国在1917年被英国占领。在此后的几十年里&#xff0c;巴勒斯坦地区成为了犹太人和阿拉伯人之间争夺的焦点。在20世纪初&a…

K8s部署 Redis 主从集群

目录 ​编辑 一、环境准备 1.1 环境说明 1.2 安装说明 1.3 Redis集群说明 1&#xff09;单实例模式 2&#xff09;哨兵模式 3&#xff09;集群模式 二、安装NFS 2.1 安装NFS 2.2 创建NFS共享文件夹 2.3 配置共享文件夹 2.4 使配置生效 2.5 查看所有共享目录 ​编…

PW系列wifi墨水屏标签操作指导

PW系列wifi墨水屏标签操作指导-V1.0 版本 操作人 操作 日期 V1.0 Kevin 创建 20220927 一、设备初始化 1.1.准备 向厂家获取一下信息&#xff1a; 服务器地址(MQTT地址) 操作账号 和操作账号绑定的(产品KEY) 1.2.安装wifi-tools工具 需要windows系统电脑并且有w…

【2022吴恩达机器学习课程视频翻译笔记】2.3监督学习-part-2

B站上面那个翻译我有点看不懂&#xff0c;打算自己啃英文翻译了&#xff08;有自己意译的部分&#xff09;&#xff0c;然后懒得做字幕&#xff0c;就丢在博客上面了&#xff0c;2.2之前的章节结合那个机翻字幕能看懂 2.3监督学习-part-2 So supervised learning algorithms …

Linux vs MacOS ,你更喜欢哪个系统?

大家应该都知道Windows&#xff0c;Linux和MacOS这几个操作系统&#xff0c;它们各有优缺点&#xff0c;比如像游戏等专门的领域&#xff0c;Windows当然是比Linux更好些&#xff0c;但Linux是开源的&#xff0c;安全性和稳定性要比Windows要好&#xff0c;如果是关于视频编辑方…

蓝绿发布、灰度发布和滚动发布

当涉及到软件发布时&#xff0c;金丝雀发布&#xff08;灰度发布&#xff09;、滚动发布和蓝绿发布是常见的策略。它们各自有自己的优缺点、区别和特点。本文将简单介绍&#xff1a; 金丝雀发布&#xff08;Canary Release&#xff09; 金丝雀发布有一个有趣的小故事&#xff…

【算法】最长公共子序列编辑距离

文章目录 最长公共子序列&#xff08;LCS&#xff09;编辑距离&#xff08;Edit Distance&#xff09;总结相关题目练习583. 两个字符串的删除操作 https://leetcode.cn/problems/delete-operation-for-two-strings/712. 两个字符串的最小ASCII删除和 https://leetcode.cn/prob…

破解 Linux 文件安放之谜:哪里才是绝佳文件归宿?

想象一下&#xff0c;你盯着 Linux 中一大堆晦涩难懂的目录名。你想知道应该把特定类型的文件放在哪里。于是把文件随意放进了 /usr/share&#xff0c;希望这样做是正确的。 几天后&#xff0c;你发现应该把它放在 /var/local。 我们都有过类似的经历。Linux 的目录结构可能非…

如何在 AlmaLinux 上安装 Cockpit

Cockpit 是一个管理平台&#xff0c;允许管理员使用远程管理器轻松管理和控制他们的 GUI 或 CLI Linux 服务器系统。浏览器。驾驶舱可通过 Web 浏览器访问&#xff0c;其仪表板可让您查看服务器的健康状况以及其他系统统计数据&#xff0c;例如网络使用情况、磁盘空间和利用率、…

FPGA-DFPGL22学习3-调试手段

文章目录 前言一、调试前瞻二、Fabric Inserter 使用步骤1、选择探针2、开启调试 总结 前言 和原子哥一起学习FPGA 开发环境&#xff1a;正点原子 ATK-DFPGL22G 开发板 参考书籍&#xff1a; 《ATK-DFPGL22G之FPGA开发指南_V1.1.pdf》 个人学习笔记&#xff0c;欢迎讨论 一…

JVM调优相关

1.jvm中的一些工具 1.1 jps jps 用于查看java进程运行情况&#xff0c;输出JVM中运行的进程状态信息 命令行参数如下&#xff1a; -m 输出传入main方法的参数 -l 输出main类或Jar的全限名 -v 输出传入JVM的参数 如上&#xff0c;bootstrap 就是tomcat进程&#xff0c;调用…

C# ref / out 用法

目录 一、简介 二、ref 关键字 案例 注意点1 注意点2 三、out 关键字 案例 注意点1 注意点2 四、ref 和 out 关键字的相同点 五、ref 和 out 关键字的不同点 结束 一、简介 在C#中&#xff0c;ref和out关键字用于参数传递的方式。它们允许在方法内部对参数进行修改…

【无标题】宋词节选与中英对照

(https://img-blog.csdnimg.cn/03a0e9fdc924401fa7ab82d42a5b8dcc.jpg)

【剑指offer刷题记录 java版】链表双指针

本系列文章记录labuladong的算法小抄中剑指offer题目 【剑指offer刷题记录 java版】链表双指针 剑指 Offer II 025. 链表中的两数相加剑指 Offer 25. 合并两个排序的链表剑指 Offer 52. 两个链表的第⼀个公共节点剑指 Offer II 021. 删除链表的倒数第 n 个结点剑指 Offer II 02…

qt event事件处理

qt事件处理 qt事件处理比较恶心&#xff0c;各个事件都是独立的。如果同一时间出现多个事件&#xff0c;某些事件在qt中接收不到。 可以参考qtbase源码事件处理部分&#xff0c;所有的事件都在switch…case中处理&#xff0c;所以一次循环只会处理一个事件。 主窗口中可以通过…

【Rust 基础篇】Rust引用详解

文章目录 引言一、什么是引用&#xff1f;二、不可变引用三、可变引用四、引用的规则五、引用的使用建议六、示例代码总结 引言 在Rust中&#xff0c;引用是一种轻量级的指向数据的方式&#xff0c;它允许我们在不获取所有权的情况下访问和操作数据。引用是Rust中处理借用操作…

PostgreSql 逻辑结构

Database Cluser: 数据库集簇&#xff0c;一套服务器上安装部署完成的一套PostgreSql。在其中可创建数据库&#xff08;Database&#xff09;、用户&#xff08;User&#xff09;。User: 数据库用户&#xff0c;用来连接访问数据库&#xff0c;可通过权限管理&#xff0c;控制其…

360手机刷机 360手机Magisk面具安装与使用教程

360手机刷机 360手机Magisk面具安装与使用教程 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360刷机包360手机刷机&#xff1a;360rom.github.io 【前序】 360手机通过Twrp&#xff0c;即可刷写Magisk文件&#xff1b;刷写成功后&#xff0c;即可获得root权限&#…