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

C语言基础——函数

d842cc1df1bd4e0e8487c2f1f3829b7b.gif  

             ʕ • ᴥ • ʔ             

づ♡ど

 🎉 欢迎点赞支持🎉

个人主页:励志不掉头发的内向程序员;

专栏主页:C语言基础;


文章目录

前言

一、函数的概念

二、库函数

2.1 库函数和头文件

2.2 库函数的使用/学习方法

三、自定义函数

3.1 函数的语法形式

3.2 函数的实现

3.3 形参和实参

总结

 


前言

大家好呀,快到端午节啦,这里提前对大家说声端午节快乐啊,在享受快乐的假期的同时也不要忘记学习呀,那么废话少说,我们就来进入本章正题函数。说到函数,我想大家可能感到不寒而栗,想到数学里被函数支配的恐怖,但是这里就不用担心,因为计算机里的函数不像数学里的那么困难,就让我们来了解一下函数是什么吧。


一、函数的概念

函数在数学中我想大家应该都不陌生,我们大家在数学方面学习和很多很多函数,比如y = kx+b,k和b都是常数,在C语言中也引入了函数的概念,也有翻译为“子程序”的,用子程序的说法更加准确一点,C语言中的函数和数学中的函数从逻辑和形式来讲都是极为相似的,它用来解决各种不同的特定任务的一小段代码,这段代码有着特殊的调用和使用方法。

C语言中函数的存在非常重要,C语言本身就是由很多个函数构成的,一个大的项目可以分解成很多个小的函数来解决,一个可以解决某种特定任务的函数是可以反复使用的,这样可以提升开发软件效率。

函数分为两类:

1、库函数:C语言自带的,可以直接使用的函数。

2、自定义函数:自己设定的,满足我们所需要的功能的函数。

 

二、库函数

 

2.1 库函数和头文件

在C语言中其实是没有所谓的库函数的,但是C语言的国际标准ANSI C规定了一些常用的函数标准,称为标准库,然后不同的厂家按照他们的风格习惯和标准库,创建出的不同的函数来实现标准库的内容,就叫库函数。

像我们所使用的scanf、printf等都是库函数都是库函数,是编译器自带的函数。

各种编译器所带的库函数都不相同,它们按照不同的功能,得用不同的头文件来声明。我们如果想要查看不同的头文件,可以去看看C语言官网:C 标准库头文件 - cppreference.com,有数学相关的、字符相关的、本地化等等,我们不要一口吃成胖子,我们可以一一学习,跟着我逐步击破。

 

2.2 库函数的使用/学习方法

库函数有很多的查看和学习的工具,例如:

1.C/C++官方库:C 标准库头文件 - cppreference.com;

2.cplusplus:C library - C++ Reference (cplusplus.com)

可能很多人在看的时候会看不懂,因为是2是全英文的,那我这里来解释一下库函数文档的一般格式

1.函数原型

2.函数功能介绍

3.参数和返回类型说明

4.代码举例

5.代码输出

6.相关知识链接

例如sqrt函数:

338d463a20cc4ecd88ab274d98471631.png

我们打开第二个链接如图,

我们可以找到sqrt函数,在网页上面有搜索,或者sqrt在math.h的头文件里自己找一些。

0b1665bcc5e847cab9355e61355fa2bf.png

183fbf2cd8a44cf4a70e2b8947fafefb.png

我们可以看到它分为6个部分,我们来看看6个部分分别是什么意思。

78c244341fed467793fbd78d1f982e98.png

这个部分就是函数原型,这各部分告诉了我们一个库函数应该这么使用。比如这里我们可以看到它括号里的就是要传入的内容,要传入一个浮点数,sqrt就是接收,要用一个浮点数接收。

520cf2ca2d8645f4bceca32c64a34cdf.png

这里就是功能介绍啦,翻译一下就是说返回x的平方根。

65ce07f4ee4749faaade1a7695387e9e.png

这里就是说我们的参数和返回类型,参数这里说了要传入一个想要平方根的x,如果x是负数就报错。返回类型也差不多,返回x的平方根,如果x是负数就报错。

d0d89c2885ce47cc931a7fbdfdf99e7f.png

f0aa5e57468b4c4291723ce6f81c001d.png

268f2d68e9674afdba4d8673ed0a161e.png

这里就是和sqrt类似的库函数啦。

我们已经看完了,那就来实际运用一下吧。

15a412cf1a894664b1a3aa5dec062c34.png

e8caf0f8f9e343a3bf303cb9b9fbae60.png

这就是一个库函数的使用和学习过程,我们一定要学会看上面的字典,还有1这个链接是中文的,里面的库函数的格式也和2链接的很相同,所以小伙伴们就自己尝试一下吧,我们接下来学习自定义函数,把自定义函数弄懂了可以很有助于我们去学习库函数,我们接下来好好看看吧。

 

三、自定义函数

自定义函数比库函数更加重要,它是我们可以自己创造的,给了程序员更多的创造性,库函数本质上也是自定义函数,只是被收录到编译器里可以直接使用罢了,但本质上也是人创造的。

 

3.1 函数的语法形式

其实自定义函数和库函数的结构是一样的。

ret_type  fun_name(形式参数)

{

 

}

ret_type:是函数的返回类型,表示函数计算结果的类型的,有的时候返回类型是void,表示什么都不返回

fun_name:是函数的名字,为了方便函数的使用而取的函数名,要尽量让函数名起的有意义

():小括号里的是函数的形式参数,就相当于加工厂的原料,函数的参数可以是void,明确表示该函数没有参数。如果有参数,那就要写清楚参数的类型和名字、以及参数的个数。

{}:大括号里的是函数体,就是函数完成计算的过程

我想小伙伴们看到这里可能就会疑惑了,函数到底是什么,该这么用,我们该如何创建,我们这里来类比一下,我们就把函数当作一个加工厂。

b8e55caff2f143d0b67d9d27ac200865.png

这是我们的函数一个基本原理,它和加工厂是很像的,

cf02f1201b694567b1c815958ea8167d.png

我们可以看到,我们想要把一个产品加工出来,我们首先得要原材料,然后要用一定的办法加工,最后就会变成我们想要的产品啦,函数也是一样的,我们如果想要创建一个函数用来完成一个功能,我们就要先明白原材料是什么,也就是参数,然后再用原材料去写入我们的加工方式,最后我们便写出了一个函数啦。文字看起来比较枯燥,我们来写写看看吧。

 

3.2 函数的实现

我们接下来来写一个能完成两个变量之间的加法的函数。

int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);int c = Add(a, b);printf("%d", c);return 0;
}

我们先创建两个变量a、b,然后再输入自己想要的值,然后我们就创建一个Add的函数,来满足我们项目的实现,很显然,我们的这个函数肯定是要有返回值的,而且是int返回值,所以我们这里就用int c来接收,当然这一步我们可以在写完函数时再来写是最好的。接下来我们来看看函数怎么写。

int Add(int a, int b)
{int c = a + b;return c;
}

这个函数写起来蛮简单的,首先我们要知道我们的返回值是什么,肯定是int型。

7b5acf2e25f7432b844d3779a524b388.png

所以这里写的就是返回变量的类型,如果没有返回类型,那就写void,有返回类型就写返回类型就好啦,这里就写int,我们的原材料,也就是参数是a和b,所以我们这里就在()里填入a和b就行啦,要记住要在前面写上a和b的类型,其实这里的a和b不是传过来的a和b,这里可能你们听上去很奇怪,但它们之间其实只是名字一样而已,不是一个东西,如果这里把函数的a和b改成m和n也没有问题,只要类型不错就行,像这样

int Add(int m, int n)
{int c = m + n;return c;
}

这个和上面的结果都是一样的,这涉及到形式参数和实际参数的问题,我下面会讲,这里就先不管这么多。然后我们就来实现功能啦,{}里的就是函数实现的功能我们要实现两个变量的相加,我们就可以用我们的先相加,然后再讲相加的结果传输回去,当然也可以这样写

int Add(int a, int b)
{return a + b;
}

这样我们就实现了一个函数的创建。来看看结果吧。

fd367fbfbcb34fa7b02547003d02c775.png

当然,我们刚刚说了,不是所有的函数都有需要返回值的,所以我们这里就再来实现一个输出函数的实现。

例如,我想实现一个可以打印呵呵的函数这么实现。

这里很显然我们不需要任何的返回值,所以返回值的地方我们就写void

5e7e8c92b5014a1c8214a17a07da61ad.png

在这里我们也不需要任何的参数,所以我们可以就放个(),里面什么都不写,当然也可以在()里写void明确表明这里不需要参数,

4730fcbd22d940979f7aecae63eebe1a.png

然后我们在{}里实现我们的函数

void Print(void)
{printf("呵呵\n");
}

这就是我们最终的结果啦,我们来用一下这个函数看看,像这样使用。

int main()
{Print();return 0;
}

7cb373e980b948559880c8fa3fc07b70.png

这就是我们最终的实现效果。

 

3.3 形参和实参

实参就是指实际参数,我们在设计函数时,把要传入给函数的变量叫做实际参数。

2a6136d6224945b9a391d5ceee3956f7.png

形参就是指形式参数,我们设计的函数名后面的参数就是形参。

4701d73c204f4f38a868fa8d04ac01a2.png

形参是形式参数的原因是因为我们程序在运行的时候在函数调用的时候,形参是没有被创建的,也就说在函数没有被调用之前形参是不存在的。

形参和实参有什么区别?它们是两个不同的个体,只是值刚好相同而已,就好比我们上面的实参a和形参a,它们就完全不是一个a,可能在日常生活中会有两个同名的人,而且岁数也一样大,但是你不能说它们是一样的,我们可以来看看它们在内存中的地址。

f75224d2c5114221b097a828b7e53b13.png

99ae9143a21f4dc2857f78de5c421479.png

我们可以看到,当a和b在主程序时是一个地址,但是当它们到子程序时又是另外一个地址啦,所以说它们之间没有关系,只是值相同而已。


总结

以上便是我们C语言中的函数部分知识,下一章我们将更加详细的说明函数的各项功能以及return的使用等等,感谢大家的观看,如果哪里有误,欢迎支持,谢谢大家。

 

相关文章:

C语言基础——函数

ʕ • ᴥ • ʔ づ♡ど 🎉 欢迎点赞支持🎉 个人主页:励志不掉头发的内向程序员; 专栏主页:C语言基础; 文章目录 前言 一、函数的概念 二、库函数 2.1 库函数和头文件 2.2 库函数的使用/…...

《精通ChatGPT:从入门到大师的Prompt指南》第1章:认识ChatGPT

第1章:认识ChatGPT 1.1 ChatGPT是什么 ChatGPT,全称为Chat Generative Pre-trained Transformer,是由OpenAI开发的一种先进的自然语言处理模型。它利用了深度学习中的一种技术——Transformer架构,来生成类人文本。ChatGPT通过对…...

智慧视觉怎么识别视频?智慧机器视觉是通过什么步骤识别视频的?

智慧视觉功能怎么识别视频?智慧视觉是搭载在智能设备比如手机、AI盒子、机器视觉系统上的一个应用程序或特性,采用计算机视觉和人工智能的技术来识别图像或视频中的内容。如果想了解视频识别,就要明白智慧视觉功能会涉及的以下几个关键步骤和…...

NineData蔡冬者参与编写墨天轮《2023年中国数据库行业年度分析报告》正式发布!

为明晰发展脉络,把握未来趋势,墨天轮于5月29日正式发布 《2023年中国数据库年度行业分析报告》。该报告由墨天轮联合业界专家学者共同编写,共330页,旨在梳理和洞察中国数据库行业的发展趋势、技术创新、市场动态以及面临的挑战&am…...

帝国cms接入腾讯云人脸识别认证代码

利用帝国cms在做一些会员系统的时候,需要做人脸识别认证,之前接入了某api接口,发现身份证识别率真的低,还好充值的少,否则要出问题,后来发现会员注册率降低了不少,最终还是决定使用腾讯云的人脸…...

计算机网络-OSI七层参考模型与数据封装

目录 一、网络 1、网络的定义 2、网络的分类 3、网络的作用 4、网络的数据传输方式 5、网络的数据通讯方式 二、OSI七层参考模型 1、网络参考模型定义 2、分层的意义 3、分层与功能 4、TCP\IP五层模型 三、参考模型的协议 1、物理层 2、数据链路层 3、网络层 4…...

[职场] 为什么不能加薪? #学习方法#知识分享#微信

为什么不能加薪? 不能加薪的根本原因,终于被我找到了! 朋友们!职场这个地方是个很神奇的世界,有些规则并不是你想象的那样。我们都希望能在这个世界里施展自己的才华,获得升职加薪的荣耀。然而&#xff0c…...

[matlab]折线图之多条折线如何绘制实心圆作为标记点

使用MarkerFaceColor是标记点填充的颜色,b,表示blue,蓝色 plot(x, a, d--, MarkerFaceColor, b); % 绘制仿真结果的曲线如果一张图多条曲线那么每条曲线需要单独调用一次plot,每个plot间用hold on 连接 plot(x, a, d--, MarkerF…...

HTML:认识HTML与基本语法的学习

前言 HTML(超文本标记语言)是用于创建网页的标记语言,由一系列标签组成,定义网页中的元素。由蒂姆伯纳斯 - 李于1990年代初发明,最初用于科研机构间共享文档,迅速演变为Web开发基础。无论是电商、博客、新…...

如何掌握 Java 正则表达式 的基本语法及在 Java 中的应用

正则表达式是一种用于匹配字符串的模式,在许多编程语言中广泛使用。Java 正则表达式提供了强大的文本处理能力,能够对字符串进行查找、替换、分割等操作。 一、正则表达式的基本语法 正则表达式由普通字符和特殊字符组成。普通字符包括字母、数字和标点…...

深度学习(三)

5.Functional API 搭建神经网络模型 5.1利用Functional API编写宽深神经网络模型进行手写数字识别 import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom…...

文件系统小册(FusePosixK8s csi)【2 Posix标准】

文件系统小册(Fuse&Posix&K8s csi)【2 Posix】 往期文章:文件系统小册(Fuse&Posix&K8s csi)【1 Fuse】 POSIX:可移植操作系统接口(标准) 1 概念 POSIX:…...

vue 弹出框组件重复打开时,资源重新加载

新增或者编辑内容使用同一个弹出框&#xff0c;如何使数据可以重新加载&#xff1f; 1、绑定时间戳&#xff0c;有副作用&#xff0c;屏幕会闪烁一下 <el-dialog :key"timer" > </el-dialog> 2、v-if和:visible.sync同时使用 <el-dialogv-if"…...

图像的IO操作

代码&#xff1a; import cv2 as cvimport matplotlib.pyplot as plt​#读取图像img cv.imread("../data/images/zidane.jpg")​#显示图像#2.1 OpenCVcv.imshow("dili",img)cv.waitKey(0)cv.destroyAllWindows()​#2.2 matplotlibplt.imshow(img[:,:,::-…...

关于 Vue.js 中`transition`组件使用:页面切换动画和标签移动动画都是要用到的

一、引言 在 Vue.js 中&#xff0c;transition组件提供了一种简单而强大的方式来实现页面过渡效果。它可以让元素在状态改变时&#xff0c;如进入或离开视图时&#xff0c;以平滑的动画方式进行过渡。通过transition&#xff0c;我们可以为应用增添更加生动和吸引人的用户体验…...

Flink Rest Basic Auth - 安全认证

背景 公司目前需要将Flink实时作业云化,构建多租户实时计算平台。目前考虑为了资源高效利用,并不打算为每个租户部署一套独立的Kubernetes集群。也就意味着多个租户的作业可能会运行在同一套kubernets集群中。此时实时作业的任务就变的很危险,因为网络可能是通的,就会存在…...

安全U盘和普通U盘有什么区别?

安全U盘&#xff08;也称为加密U盘或安全闪存驱动器&#xff09;与普通U盘肯定是有一些区别的&#xff0c;从字面意思上来看&#xff0c;就能看出&#xff0c;安全U盘是能够保护文件数据安全性的&#xff0c;普通U盘没这一些功能的&#xff0c;可随意拷贝文件&#xff0c;不防盗…...

大数据与数据科学的学科边界

大数据和数据科学是两个紧密相关但又不完全相同的学科。它们都关注数据的收集、管理、分析和解释&#xff0c;但侧重点有所不同。 大数据主要关注处理和分析大规模数据集的技术和方法。它涉及到数据存储、数据处理、数据挖掘、数据可视化和分布式计算等方面的技术。大数据的目…...

Chrome 源码阅读:跟踪一个鼠标事件的流程

我们通过在关键节点打断点的方式&#xff0c;去分析一个鼠标事件的流程。 我们知道chromium是多进程模型&#xff0c;那么&#xff0c;我们可以推测&#xff1a;一个鼠标消息先从主进程产生&#xff0c;再通过跨进程通信发送给渲染进程&#xff0c;渲染进程再发送给WebFrame&a…...

[C/C++]_[初级]_[在Windows和macOS平台上导出动态库的一些思考]

场景 最近看了《COM本质论》里关于如何设计基于抽象基类作为二进制接口,把编译器和链接器的实现隐藏在这个二进制接口中,从而使用该DLL时不需要重新编译。在编译出C接口时,发现接口名直接是函数名,比如BindNativePort,怎么不是_BindNativePort?说明 VC++导出的函数默认是使…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...