C语言基础——函数

ʕ • ᴥ • ʔ

づ♡ど

🎉 欢迎点赞支持🎉

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

专栏主页: C语言基础


文章目录

前言

一、函数的概念

二、库函数

[2.1 库函数和头文件](#2.1 库函数和头文件)

[2.2 库函数的使用/学习方法](#2.2 库函数的使用/学习方法)

三、自定义函数

[3.1 函数的语法形式](#3.1 函数的语法形式)

[3.2 函数的实现](#3.2 函数的实现)

[3.3 形参和实参](#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函数:

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

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

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

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

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

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

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

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

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

三、自定义函数

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

3.1 函数的语法形式

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

ret_type fun_name(形式参数)

{

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

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

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

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

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

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

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

3.2 函数的实现

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

cs 复制代码
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来接收,当然这一步我们可以在写完函数时再来写是最好的。接下来我们来看看函数怎么写。

cs 复制代码
int Add(int a, int b)
{
	int c = a + b;
	return c;
}

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

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

cs 复制代码
int Add(int m, int n)
{
	int c = m + n;
	return c;
}

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

cs 复制代码
int Add(int a, int b)
{
	return a + b;
}

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

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

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

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

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

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

cs 复制代码
void Print(void)
{
	printf("呵呵\n");
}

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

cs 复制代码
int main()
{
	Print();
	return 0;
}

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

3.3 形参和实参

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

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

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

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

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


总结

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

相关推荐
Envyᥫᩣ9 分钟前
C#语言:从入门到精通
开发语言·c#
童先生30 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu31 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会1 小时前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??1 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
远望清一色1 小时前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee