c语言基础~函数详解

前言

今天我们来学习一波函数的概念,帮助各位理解函数,本次博客取自一些书籍以及各大网站的讲解,把它整合在一起并且详细讲解

1函数的理解

我们得知道什么是函数,函数的作用是什么,好不会表述没关系,我们翻书

c primer plus 是这么说的"函数是指完成任务的独立程序代码单元"

函数的分类1 库函数    2 自定义函数
库函数分很多种 IO函数 字符串操作函数 内存操作函数 
时间/日期函数
数学函数(要用#include<math.h>) 其他函数
函数在c语言的专业名词为fuction
 

2自定义函数的语法

函数有什么呢

举个最简单的例子,看代码

//1函数的声明
int Add(int a,int b);
int main()
{
int a=10;
int b=20;
printf("%d",Add(a,b));//2函数的调用
return 0;
}
3函数的定义
int Add(int a,int b)//4有返回值的函数 返回类型为int
{
return a+b;
}

1函数的声明

函数的声明可以使编译器找到该函数,如果说自定义函数在main的后面并且没有声明,那么就会出现错误

举例吧

当只有一个自定义函数时,编译器并没有报错,但是是有警告的

>D:\c\haha\FileName.c(963,15): warning C4013: “Add”未定义;假设外部返回 int

其实在语法中这个是错误的,只不过编译器优化了

那么接着看 当我们调用两个自定义函数时

就会发生报错,解决方法很简单的

只要提前声明不就好了,让我们的编译器知道有这么一个函数不就好了

相信大家大家已经会解决这类问题了

2函数的定义

哎呀函数的定义不就是 函数的内容吗 {}就是花括号里头的内容,

当然我们发现在函数的声明中有两个参数 在定义的过程中

语法为 返回类型 函数名(类型 +变量名1,类型+变量名2````````)

我们从左往右看

返回类型分两个 一个是有返回值 通常的表述为类型 比如 int float double int*等等

另一个是无返回值 就直接是void 他们会返回一个值表示某些特殊的条件

大家也看到上面的代码中出现了

函数名就是他的名字 在C语言中函数名不可以重复,既自定义的函数不能与库函数同名

并且自己也不能写两个同名函数,在c++中是可以的,叫做函数重载,以后会提到

接着是参数,在函数声明中的参数叫做形参,而在调用中的参数叫做实参

3函数的调用

在函数的调用中就用讲头了, 1在函数的声明中有几个参数,我们在调用时就必须要使用

几个参数  2参数的类型必须一一对应不能乱传 3在调用时,函数的实参会被拷贝一份到形参中

但是形参的改变不会影响到实参

我们可以举例,还是用最简单的例子吧 交换 a b变量的值

void Swap(int a,int b)
{
int temp=a;
a=b;
b=temp;
}
int main()
{int a=10;
int b=20;
Swap(a,b);
printf("%d %d",a,b);
return 0;
}

此时 a b的值并没有改变

解决方法也很简单

void Swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int main()
{int a=10;
int b=20;
Swap(&a,&b);
printf("%d %d",a,b);
return 0;
}

只需通过指针即可

其实这两种调用分别称为 传值调用和传址调用

3库函数

库函数顾名思义,就是在C语言库里的函数,他们已经被定义声明好了

我们只需拿来就用就好,为了方便大家理解

我们还是举例子说明

stdio库函数 printf scanf   io输入输出函数举例

#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
printf("%d",a);
return 0;
}

strlen 库函数     全名string(字符) length(长度)所以该函数时计算字符串的长度 举例

  
#include<stdio.h>
#include<string.h>
int main()
{char arr[]="hahahaha";int a = strlen(arr);printf("%d", a);return 0;
}

这个函数是计算字符串长度的函数(不包括\0)

math库函数 举个例子 floor sqrt

#include<stdio.h>
#include<math.h>
int main()
{int a=10;
int b=floor(sqrt(10));
printf("%d",b);
return 0;
}

floor(a)返回一个不超过a的最大整数

sqrt(a)计算a的算术平方根

我们这里以三个最常用的库函数给大家举例

4函数的嵌套使用和链式访问

1嵌套使用

函数的内部可以再调用函数

举例

#include<stdio.h>
int main()
{
printf("%d",10);
return 0;
}

没想到吧这就是在主函数里调用库函数printf,可以说是最简单的例子了

2链式访问

把一个函数的返回值作为另一个函数的参数

看代码

提示printf函数的返回值为size_t类型  大小为打印的数量

#include<stdio.h>
int main()
{printf("%d",printf("%d",printf("%d",43)));return 0;
}

大家看的出结果吗答案是4321

43是两个占位符第一个内部的printf返回2,接着把2打印出来

又返回1,再把1打印出来

 5函数递归

运用自身的编程技巧称为递归(recursion)
把大型问题转化为小型问题

举例来看 看一看最简单的递归

void print();
void print()//结果是一直打印haha
{printf("haha");print();
}
int main()
{print();return 0;
}
//这就是最简单的递归函数,但此函数:如递归所有控件路径,函数将导致运行时堆栈溢出(stack overflow)

接下里再看代码

1.接受一个整形(无符号),按照顺序打印它的每一位


void NB(int x);
void NB(int x)
{if (x > 9){NB(x/10);}printf("%d\n", x % 10);
}
int main()
{int n;scanf("%d", &n);NB(n);return 0;
}

看结果


 

说实话,如果不理解递归可以画图来理解

我们以上述代码结果例子来举例吧

1 接受一个值 123456

2进入函数 NB() 123456>9   执行NB(123456/10)12打印(123456%10)结束该函数

3第一次递归 12345>9    执行NB(1234)              11打印(12345%10)返回到原有的函数

4第二次递归1234>9   执行NB(123)                    10打印(1234%10)返回到第一次递归

5第三次递归123>9  执行NB(12);                       9打印(123%10)返回到第二次递归

6第四次递归12>9    执行NB(1)                          8打印(12%10)返回到第三次递归

7第五次递归1<9       打印(1 %10)返回到第四次递归来      

上面就是递归的全过程了

通过这个我们可以总结出两点
1.递归要有限制条件
2.每次递归要更接近条件


总结

今天的内容就到这里了,之后还是要多加练习,祝大家天天开心

上一张思维导图



 

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

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

相关文章

科技云报道:第五次工业革命,中国AI企业如何打造新质生产力?

科技云报道原创。 人类历史的叙述与技术进步的影响深深交织在一起。 迄今为止&#xff0c;每一次工业革命都彻底改变了我们社会的轮廓&#xff0c;引入了机械化、大规模生产和数字化&#xff0c;并重新定义了人类生存的规范。 自2022年11月30日OpenAI发布ChatGPT以来&#x…

C++Qt学习——QFile、QPainter、QChart

目录 1、QFile&#xff08;文本读写&#xff09;——概念 1.1、拖入三个控件&#xff0c;对pushButton进行水平布局&#xff0c;之后整体做垂直布局 1.2、按住控件&#xff0c;转到槽&#xff0c;写函数 1.3、打开文件控件 A、首先引入以下两个头文件 B、设置点击打开文件控…

C++进阶之路---手撕“红黑树”

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、红黑树的概念与性质 1.概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点…

多模态数据融合简介#翻译

翻译自—— 感谢外国友人分享&#xff0c;鄙人在此翻译分享给大家INTRODUCTION TO DATA FUSION. multi-modality | by Haylat T | Haileleol Tibebu | Medium 多模态梳理_多模态图像和多模态方法的区别-CSDN博客 #这个网u也写得不错&#xff01; 多模态 神经网络是最著名的机…

idea远程试调jar、远程试调war

idea远程试调jar、远程试调war 目的&#xff1a;测试运行时与ide开发时是否一致。 配置jar Maven中添加 <packaging>jar</packaging>将其打包为jar。 设置运行入口main 编译jar 看到jar输出 配置试调 添加jar运行 远程试调 先在源码中打好断点试调 debug运行…

React的基本使用

安装VSCode插件 ES7 Reactopen in browser React基本使用 基本使用步骤 引入两个JS文件&#xff08; 注意引入顺序 &#xff09; <!-- react库, 提供React对象 --> //本地 <script src"../js/react.development.js"></script> //线上 //<scr…

Python大数据实践:selenium爬取京东评论数据

准备工作 selenium安装 Selenium是广泛使用的模拟浏览器运行的库&#xff0c;用于Web应用程序测试。 Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样&#xff0c;并且支持大多数现代 Web 浏览器。 #终端pip安装 pip install selenium #清华镜像安装 p…

【Ubuntu】Ubuntu的安装和配置

下载ubuntu镜像 https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-desktop-amd64.iso 一、Ubuntu安装 1.新建虚拟机 1.1按照它的提示创建用户&#xff1b;后面一直下一步就好 2.启动Ubuntu虚拟机 2.1设置为中文键盘 2.2默认即可&#xff1b;若是有低需求也可以选择最小…

企业开展开源安全治理必要性及可行性详细分析

背景 开源软件安全威胁是近几年企业安全面临的主要威胁&#xff0c;也是企业应用安全方向讨论的热门话题&#xff0c;但是由于是新的需求新的方向&#xff0c;很多企业在观望&#xff0c;当前开展这项工作是否已经成熟&#xff0c;项目成功率如何&#xff1f; 当新鲜事物产生时…

【C语言】linux内核软中断

一、什么是软中断&#xff1f; 内核中的软中断&#xff08;Softirqs&#xff09;和任务下半部&#xff08;Tasklets&#xff09;是Linux内核中用于在中断上下文之外处理中断服务的一种底层机制。这些机制解决了不能在中断服务例程&#xff08;ISR&#xff09;中执行耗时操作或…

Apache Doris 2.1 核心特性 Variant 数据类型技术深度解析

在最新发布的 Apache Doris 2.1 新版本中&#xff0c;我们引入了全新的数据类型 Variant&#xff0c;对半结构化数据分析能力进行了全面增强。无需提前在表结构中定义具体的列&#xff0c;彻底改变了 Doris 过去基于 String、JSONB 等行存类型的存储和查询方式。为了让大家快速…

在IDEA中设置使用鼠标滚轮控制字体大小

IDEA是我们常用的程序编程工具&#xff0c;有时为了方便&#xff0c;我们需要随时的调整字体的大小 本篇文章我使用了两种方式来设置IDEA中的字体大小 方式一&#xff1a;使用传统的方式来设置 首先在IDEA顶部的菜单栏中选择“file”菜单 然后在“file”菜单中选择“Setting…

Gitlab-runner注册与配置

文章目录 概要操作流程获取HTTPS证书上传证书修改gitlab-runner dns配置文件gitlab-runner 注册 概要 本文主要介绍了Gitlab-runner在内网环境注册到gitlab的操作方式。内网环境如下&#xff1a; 1、gitlab-runner由docker镜像部署&#xff1b; 2、gitlab部署与内网&#xff0…

3D Tiles语义分割流水线

Dylan Chua 和 Anne Lee 开发了一个处理管线&#xff0c;用于对 3D Tiles 中包含的 GL 传输格式 (glTF) 模型进行语义分割。 该管道读取并遍历 3D Tileset&#xff0c;以输出包含元数据的经过转换的划分对象集。 该项目为 3D 语义分割器提供了最小可行产品&#xff0c;作为各种…

视频技术2:把rtsp转为各种格式,包括webrtc

前题是启动ABLMediaServer&#xff0c;把ini里的hls_enable1 1、添加rtsp到视频服务器 http://127.0.0.1:7088/index/api/addStreamProxy?secret035c73f7-bb6b-4889-a715-d9eb2d1925cc&vhost_defaultVhost_&appMedia&streamCamera_00001&enable_hls1&ur…

【数据结构与算法】设计循环队列

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;C &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#xff0c;专注C/C/GO的干货分…

2022年第十三届蓝桥杯比赛Java B组 【全部真题答案解析-第一部分】

最近回顾了Java B组的试题&#xff0c;深有感触&#xff1a;脑子长时间不用会锈住&#xff0c;很可怕。 兄弟们&#xff0c;都给我从被窝里爬起来&#xff0c;赶紧开始卷&#xff01;&#xff01;&#xff01; 2022年第十三届蓝桥杯Java B组(第一部分 A~F题) 目录 一、填空题 …

详解基于快速排序算法的qsort的模拟实现

目录 1. 快速排序 1.1 快速排序理论分析 1.2 快速排序的模拟实现 2. qsort的模拟实现 2.1 qsort的理论分析 2.2 qsort的模拟实现 qsort函数是基于快速排序思想设计的可以针对任意数据类型的c语言函数。要对qsort进行模拟实现&#xff0c;首先就要理解快速排序。 1. 快…

【数据结构】堆的创建

文章目录 一、堆的概念及结构1、什么是堆2、堆的性质3、堆的结构及分类 二、堆的创建1、堆向下调整算法2、堆向上调整算法3、堆的创建&#xff08;向上调整算法&#xff09; 一、堆的概念及结构 1、什么是堆 堆就是以二叉树的顺序存储方式来存储元素&#xff0c;同时又要满足父…

智慧城市中的智慧生活:便捷、舒适与高效

目录 一、智慧城市中的智慧生活概述 二、智慧生活带来的便捷性 1、智慧交通的便捷出行 2、智慧购物的轻松体验 3、智慧政务的一站式服务 三、智慧生活带来的舒适性 1、智慧环境的绿色宜居 2、智慧医疗的健康保障 3、智慧教育的均衡发展 四、智慧生活带来的高效性 1、…