C语言·函数(超详细系列·全面总结)

前言:Hello大家好😘,我是心跳sy,为了更好地形成一个学习c语言的体系,最近将会更新关于c语言语法基础的知识,今天更新一下函数的知识点,我们一起来看看吧!  

目录

一、函数是什么 💫

二、C语言中函数的分类 💫

1、⭐️库函数⭐️

 2.1、🌈库函数的使用

 2.2、🌈常用的库函数

2、⭐️自定义函数⭐️

三、函数的组成 💫

1、⭐️函数的基本组成⭐️

2、⭐️函数的参数⭐️

2.1、🌈实际参数(实参)

2.2、🌈形式参数(形参)

2.3、🌈实参与形参的匹配

3、⭐️函数的声明和定义⭐️

3.1、🌈函数声明

3.2、🌈函数的定义

四、函数的调用 💫

五、函数的嵌套调用和链式访问 💫

1、⭐️嵌套调用⭐️

2、⭐️链式访问⭐️

六、函数递归 💫

1、⭐️什么是递归?⭐️

2、⭐️递归的两个必要条件⭐️

3、⭐️递归的基本原理⭐️

4、⭐️递归实例⭐️


一、函数是什么 💫

👉在C语言中,函数是一段完成特定任务的代码块,它可以被多次调用,接受输入参数并可选地返回一个值;函数是结构化编程的基础,允许程序员将一个大问题分解为多个小问题,每个小问题由一个函数来封装,这种方式提高了代码的可读性、可维护性和可重用性。

二、C语言中函数的分类 💫

1、⭐️库函数⭐️

⭕️C语言库函数是指在C语言标准库中预先定义好的函数,这些函数包含在相应的头文件里,每个函数都有其函数名、返回值类型和函数参数;这些函数用于执行常见的任务,例如输入输出、字符串处理、内存操作等。

⭕️C语言标准库是一组标准化的函数和工具,旨在为C语言程序员提供基本的编程支持。库函数通常以源代码形式或预编译形式提供,可以直接在C程序中使用,而无需从零开始编写这些功能的代码;以下情况使用的函数都属于库函数:

🔶比如我们想把程序结果打印到屏幕上看看,会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上(printf)。

🔶在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。

🔶在编程是我们也计算,总是会计算n的k次方这样的运算(pow)。 

2.1、🌈库函数的使用

👉要在C程序中使用库函数,首先需要包含相应的头文件。例如,使用 printf 函数需要在程序顶部添加以下代码:

#include <stdio.h>

👉然后,就可以在程序中调用 printf 函数了:

int main() {printf("Hello, World!\n");return 0;
}

 2.2、🌈常用的库函数

🎀简单的总结,C语言常用的库函数都有:

🔸IO函数

🔸字符串操作函数

🔸字符操作函数

🔸内存操作函数

🔸时间/日期函数

🔸数学函数

🔸其他库函数

🍀因为具体的函数太多了,这里不一一列举了,我们在日常学习中,需要养成查询库函数使用方法的习惯哦,这里分享一个查询库函数的网站:👉http://en.cppreference.com(英文版)

2、⭐️自定义函数⭐️

❓如果库函数能干所有的事情,那还要程序员干什么?

⭕️所以更加重要的是自定义函数;自定义函数和库函数一样,有函数名,返回值类型和函数参数,但是与库函数不一样的是这些都是我们自己来设计,这就给程序员了一个很大的发挥空间。

👉我们来看一个自定义的函数实现找出两个整数中的最大值:

#include <stdio.h>
//get_max函数的设计int get_max(int x, int y)
{return (x>y)?(x):(y);
}int main()
{int num1 = 10;int num2 = 20;int max = get_max(num1, num2);printf("max = %d\n", max);return 0;
}

👉其中 get_max 就是我们自己定义的函数,用于实现求两整数最大值的算法,并在主函数中调用,用 max 来接收返回值。 

三、函数的组成 💫

1、⭐️函数的基本组成⭐️

👉一个C语言函数通常由以下几个部分组成:

💠返回类型:指定函数返回的数据类型。如果函数不返回任何值,则使用 void 。

💠函数名:函数的名称,用于调用该函数。

💠参数列表:一组定义在圆括号内的参数,用于接受调用者传递给函数的数据。参数可以是多种数据类型,甚至是其他函数。

💠函数体:包含在花括号 { } 中的代码块,这里包含了函数执行的具体逻辑。

⭕️其中返回类型指定了函数执行完毕后返回的数据类型,可以是整型、字符型、各种指针类型等,如果函数不返回任何值,则使用 void。例如,int 表示函数返回一个整数,void 表示函数不返回任何值。

⭕️函数名是函数的标识符,用于在程序中调用该函数。我们在写函数时,函数名应该清晰地反映函数的目的或行为。

👉下面具体讲解如何使用函数:

2、⭐️函数的参数⭐️

2.1、🌈实际参数(实参)

❓什么是实参?

⭕️真实传给函数的参数,叫实参

⭕️实参可以是:常量、变量、表达式、函数等;

⭕️无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

int main() {int years = 30;char* person = "Alice";printMessage(years, person); // 函数调用,years 和 person 是实参return 0;
}

在这个例子中,years 和 person 就是实参。

2.2、🌈形式参数(形参)

⭕️形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单元),所以叫形式参数。

⭕️形式参数当函数调用完成之后就自动销毁了,因此形式参数只在函数中有效。

⭕️在函数定义时,形参由它们的类型和名称组成,例如:

void printMessage(int age, char* name) {printf("Name: %s, Age: %d\n", name, age);
}

在这个例子中,age 和 name 就是形参。

2.3、🌈实参与形参的匹配

⭕️在函数调用时,C语言编译器会检查实参与形参的类型和数量是否匹配。如果实参与形参的类型和数量不匹配,可能会导致编译错误或运行时错误。

👉例如,以下代码将导致编译错误,因为printMessage 函数期望两个参数,但只提供了一个:

printMessage("Bob"); // 编译错误:缺少参数

3、⭐️函数的声明和定义⭐️

3.1、🌈函数声明

🔶在调用函数之前,必须声明函数。函数声明定义了函数的接口,使得函数可以在其他部分被调用,它通常放在程序的顶部或头文件中,包括函数名、返回类型和参数列表。

👉例如:

int add(int a, int b); // 声明一个返回int类型,接受两个int参数的函数

3.2、🌈函数的定义

🔶函数定义是函数的实际实现,它包括函数声明的所有部分,再加上函数体(函数体是一组语句,它们定义了当函数被调用时执行的操作)例如:

int add(int a, int b) { // 函数定义int result = a + b;return result;
}

四、函数的调用 💫

🔶函数调用是执行函数的过程。要调用一个函数,只需使用函数名并提供必要的参数(如果函数有参数的话)。例如:

int sum = add(3, 5); // 调用add函数,并将返回值赋给sum变量

👉完整的调用如下: 

#include <stdio.h>// 函数声明
int add(int a, int b);// 函数定义
int add(int a, int b)
{int sum = a + b;return sum;
}int main() 
{int result = add(10, 20); // 函数调用printf("Result: %d\n", result);//输出30return 0;
}

五、函数的嵌套调用和链式访问 💫

1、⭐️嵌套调用⭐️

#include <stdio.h>void new_line()
{printf("hehe\n");
}void three_line()
{int i = 0;for(i=0; i<3; i++){new_line();//继续调用}
}int main()
{three_line();return 0;
}

🔴注意:函数可以嵌套调用,但是不能嵌套定义

2、⭐️链式访问⭐️

⭕函数链式访问(也称为函数链式调用)是一种编程技巧,是把一个函数的返回值作为另外一个函数的参数来调用。

​
#include <stdio.h>
#include <string.h>int main()
{char arr[20] = "hello";int ret = strlen(strcat(arr,"bit"));//求字符串长度printf("%d\n", ret);return 0;
}​

六、函数递归 💫

1、⭐️什么是递归?⭐️

程序调用自身的编程技巧称为递归( recursion);函数递归是指函数在执行过程中调用自身的一种技术。

2、⭐️递归的两个必要条件⭐️

⭕递归函数通常包含两部分:基线条件和递归条件;

⭕基线条件是递归函数停止递归的条件,而递归条件是递归函数继续调用自身的条件。递归是一种强大的编程技术,它可以使代码更简洁、更优雅,但需要小心使用,以避免无限递归导致的栈溢出等问题。

3、⭐️递归的基本原理⭐️

⭕递归函数通过反复调用自身来解决问题,每次调用时问题规模都会减小,直到达到基线条件,递归停止。递归函数在调用自身时,会创建一个新的函数栈帧,用于存储局部变量和参数。当递归结束时,这些栈帧会依次弹出,恢复到最初的调用状态。

4、⭐️递归实例⭐️

👉 计算阶乘:

#include <stdio.h>// 递归函数:计算阶乘
int factorial(int n) 
{// 基线条件if (n == 0){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 函数是一个递归函数,它计算并返回一个整数的阶乘。当 n 等于0时,函数返回1,这是基线条件。否则,函数调用自身,并返回 n 乘以 factorial (n-1) 的结果 

🔶当调用 factorial(5) 时,以下是函数调用的过程:

🔸第一次调用factorial(5) 因为 n 不等于0,所以执行 return 5* factorial(4) ,这次调用会暂停,等待 factorial(4) 的结果。

🔸第二次调用factorial(4) n 不等于0,执行 return 4* factorial(3) ,这次调用会暂停,等待factorial(3) 的结果

🔸如此下去直到第六次调用,factorial(0), n 等于0,所以触发基线条件,返回1。

🔷当 factorial(0) 返回1时,递归调用开始依次返回:

🔹第五次调用返回factorial(1),返回 1*1=1

🔹第四次调用返回factorial(2),返回 2*1=2

🔹第三次调用返回factorial(3),返回 3*2=6

🔹第二次调用返回factorial(4),返回 4*6=24

🔹第一次调用返回factorial(5),返回 5*24=120

👉最终得出5的阶乘为120。

函数篇到此结束💞💞💞感谢大家花费宝贵的时间阅读本文章,制作不易,希望大家多多支持呀😘😘😘,如有任何问题欢迎各位大佬在评论区批评指正!!!

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

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

相关文章

vue、js截取视频任意一帧图片

html有本地上传替换部分&#xff0c;可以不看 原理&#xff1a;通过video标签对视频进行加载&#xff0c;随后使用canvas对截取的视频帧生成需要的图片 <template> <el-row :gutter"18" class"preview-video"><h4>视频预览<span&…

execv函数简单使用

在Unix-like系统中&#xff0c;execv 函数用于执行一个新的程序&#xff0c;同时可以传递参数给它。这个函数是 exec 系列函数之一&#xff0c;用于替换当前进程映像。 execv 的原型如下&#xff1a; int execv(const char *path, char *const argv[]); path&#xff1a;新程…

【边缘计算网关教程】9.对接ThingsBoard(MQTT协议)

前景回顾-【边缘计算网关教程】8.ModbusTCP采集存储Influxdb-CSDN博客 目录 需求分析 平台配置&#xff1a; 需求实现 第一步&#xff1a;采集Modbus TCP数据 第二步&#xff1a;拼接Json 第三步&#xff1a;MQTT上报 平台配置 第一步&#xff1a;添加设备 ​编辑第二…

国内新能源汽车芯片自给,承认差距,任重道远

【科技明说 &#xff5c; 科技热点关注】 据近日工信部电子五所元器件与材料研究院高级副院长罗道军表示&#xff0c;中国拥有最大的新能源车产能&#xff0c;芯片用量也是越来越多。但是芯片的自给率目前不到10%&#xff0c;是结构性的短缺。 中国拥有最大新能源车产能&#…

自学网络安全:从菜鸟到守护者的蜕变之旅

在这个数字化时代&#xff0c;网络安全不再是遥不可及的专业术语&#xff0c;而是与我们每个人的生活息息相关。随着网络攻击事件的频发&#xff0c;掌握一定的网络安全知识&#xff0c;不仅是对个人隐私的保护&#xff0c;更是对社会安全的贡献。今天&#xff0c;就让我们一起…

从太阳神到弥勒佛

对于学习英语的人来说&#xff0c;太阳神&#xff0c;最为知名的&#xff0c;就是阿波罗&#xff08;Apollo&#xff09;&#xff0c;人类最近的历史&#xff0c;最知名的&#xff0c;就是阿波罗计划。 说白了&#xff0c;阿波罗计划&#xff0c;这个音译词&#xff0c;对于英语…

用Docker来开发

未完成。。。 现在好像用Docker是越来越多了。之前其实也看过docker的原理&#xff0c;大概就是cgroup那些&#xff0c;不过现在就不看原理了&#xff0c;不谈理论&#xff0c;只看实际中怎么用&#xff0c;解决眼前问题。 用docker来做开发&#xff0c;其实就是解决的编译环境…

InceptionV3代码实现(Pytorch)

文章目录 Inception介绍InceptionV3代码实现第一步&#xff1a;定义基础卷积模块第二步&#xff1a;定义Inceptionv3模块InceptionAInceptionBInceptionCInceptionDInceptionE 第三步&#xff1a;定义辅助分类器InceptionAux第四步&#xff1a;搭建GoogLeNet网络第五步*&#x…

PJA1介导的焦亡抑制是鼻咽癌产生耐药性的驱动因素

引用信息 文 章&#xff1a;PJA1-mediated suppression of pyroptosis as a driver of docetaxel resistance in nasopharyngeal carcinoma. 期 刊&#xff1a;Nature Communications&#xff08;影响因子&#xff1a;14.7&#xff09; 发表时间&#xff1a;2024年6月2…

unity 把Vuforia的Image做成预制件prefab后,通过ab加载或者其他动态加载后,扫描图片不会出现模型

//通过ab加载资源&#xff08;自己封装的ab加载的脚本&#xff09;GameObject go LoadHandle.Instance.LoadPrefab.LoadPrefabAssets("ImagePrefab");GameObject game GameObject.Instantiate(go);//加载预制件后&#xff0c;加载图片的数据库// 初始化 Vuforia I…

链接追踪系列-10.mall-swarm微服务运行并整合elk-上一篇的番外

因为上一篇没对微服务代码很详细地说明&#xff0c;所以在此借花献佛&#xff0c;使用开源的微服务代码去说明如何去做链路追踪。 项目是开源项目&#xff0c;fork到github以及gitee中&#xff0c;然后拉取到本地 后端代码&#xff1a; https://gitee.com/jelex/mall-swarm.gi…

【字幕】字幕特效入门

前言 最近两周调研了一下字幕特效的底层程序逻辑&#xff0c;因为工作内容的原因&#xff0c;就分享几个自己找的链接具体细节就不分享了&#xff0c;CSDN也是我的个人笔记&#xff0c;只记录一些简单的内容用于后续自己方便查询&#xff0c;顺便帮助一下正在苦苦查阅资料入门…

51单片机学习(4)

一、串口通信 1.串口通信介绍 写完串口函数时进行模块化编程&#xff0c;模块化编程之后要对其进行注释&#xff0c;以便之后使用模块化函数&#xff0c;对模块化.c文件中的每一个函数进行注释。 注意&#xff1a;一个函数不能既在主函数又在中断函数中 模式1最常用&#xf…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十)-服务体验保证的用例

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

Go语言中的并发

简单介绍go中的并发编程. 涉及内容主要为goroutine, goroutine间的通信(主要是channel), 并发控制(等待、退出). 想查看更多与Go相关的内容, 可以查看我的Go编程栏目 Goroutine 语法 在一个函数调用前加上go即可, go func(). 语法很简单, 可以说是并发写起来最简单的程序语言…

rust编译安卓各个平台so库

安卓studio 安装SDK 和 NDK 所有操作是mac m1 上操作的 NDK 可以在 Android studio 设置里面,搜索sdk &#xff0c;然后看下SDK 位置例如我下面的位置: /Users/admin/Library/Android/sdk/ndkAndroid NDK&#xff08;Native Development Kit&#xff09;生成一个独立的工具链…

Java中锁的全面详解(深刻理解各种锁)

一.Monitor 1. Java对象头 以32位虚拟机位例 对于普通对象,其对象头的存储结构为 总长为64位,也就是8个字节, 存在两个部分 Kclass Word: 其实也就是表示我们这个对象属于什么类型,也就是哪个类的对象.而对于Mark Word.查看一下它的结构存储 64位虚拟机中 而对于数组对象,我…

Java中的迭代器(Iterator)

Java中的迭代器&#xff08;Iterator&#xff09; 1、 迭代器的基本方法2、 迭代器的使用示例3、注意事项4、克隆与序列化5、结论 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;迭代器&#xff08;Iterator&#xff0…

Web开发:四角线框效果(HTML、CSS、JavaScript)

目录 一、实现效果 二、完整代码 三、页面准备 1、页面结构 2、初始样式 3、现有效果 三、线框实现 1、需求分析 2、线框结构 3、线框大小 4、线框位置 5、线框样式 6、移动线框 7、添加过渡效果 8、使用CSS变量 一、实现效果 如下图所示&#xff0c;当鼠标移动…

html 单页面引用vue3和element-plus

引入方式&#xff1a; element-plus基于vue3.0&#xff0c;所以必须导入vue3.0的js文件&#xff0c;然后再导入element-plus自身所需的js以及css文件&#xff0c;导入文件有两种方法&#xff1a;外部引用、下载本地使用 通过外部引用ElementPlus的css和js文件 以及Vue3.0文件 …