C语言入门篇(五)

news2024/9/21 12:43:51

前言
  函数是 C 语言中的重要组成部分,它可以将程序分解为模块,提高代码的可读性和可维护性。
  🍒本篇文章将详细介绍 C 语言中的函数。

函数

  • 1. 函数是什么?
  • 2. 函数的分类
    • 2.1 库函数
    • 2.2 自定义函数
  • 3. 函数的参数
    • 3.1 实际参数
    • 3.2 形式参数
  • 4. 函数的调用
    • 4.1 传值调用
    • 4.2 传址调用
  • 5. 函数的嵌套调用和链式访问
    • 5.1 嵌套调用
    • 5.2 链式访问
  • 6. 函数的声明和定义
    • 6.1 函数声明
    • 6.2 函数定义
  • 结束语

1. 函数是什么?

数学中我们常见到函数的概念,C语言中也有函数。

在维基百科中,函数称为子程序,是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。

🍩每个 C 程序都至少有一个函数,即主函数 main()

2. 函数的分类

2.1 库函数

为什么会有库函数?

🍥 在学习C语言编程的时候,我们会频繁的使用一个功能:printf(),它的作用是将信息按照一定的格式打印到屏幕上。

🍥 如果你需要通过键盘给程序中的变量赋值,scanf()函数可以帮你实现。

🍥 在编程时,我们也会进行计算,比如sqrt(),帮助我们获得某一个数字平方根。

像上面描述的常用功能,C语言将它们进行了封装,提供一系列类似的库函数,放便大家使用。

C语言常用的库函数:

  • IO函数(input-output):scanf、printf、getchar、putchar
  • 字符串操作函数:strlen、strcmp…
  • 字符操作函数:islower、isupper
  • 内存操作函数:memset、memcmp
  • 时间/日期函数:time
  • 数学函数:sqrt、pow…
  • 其他库函数

🍩注:使用库函数,必须包含#include对应的头文件

cplusplus–大家可以通过此网站查询函数的具体使用方法

2.2 自定义函数

现实生活中,库函数并不能解决所有问题,于是就有了自定义函数

自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计。

函数的组成:

ret_type fun_name(para1, * )
{
	statement;//语句项
}
//ret_type:返回类型
//fun_name:函数名
//para1:函数参数

🍤实例:

求两个整数之和

#include<stdio.h>
//sum函数的设计
int sum(int x, int y)//int是返回类型,sum是函数名
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 10;
	int s = sum(a, b);//调用sum函数
	printf("%d\n", s);
	return 0;
}

这里的sum函数就是用户自定义的一个求和函数,根据求和的个数和数据的类型,可以改变参数的数量以及返回的类型。

3. 函数的参数

3.1 实际参数

真实传给函数的参数,叫实参
实参可以是:常量、变量、表达式、函数等。

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

3.2 形式参数

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

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

🍤举个例子说明一下:

使用函数交换两个整型变量的内容

#include<stdio.h>
void swap1(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}

void swap2(int* p, int* q)
{
	int temp = *p;//temp = a
	*p = *q;//a = b
	*q = temp;//b = temp
}

int main()
{
	int a = 10;
	int b = 20;

	printf("交换前:a=%d b=%d\n", a, b);
	swap1(a, b);//传值调用:在这种设计中,形参是实参的一份临时拷贝,对形参的修改不会影响实参

	printf("交换后:a=%d b=%d\n", a, b);

	printf("交换前:a=%d b=%d\n", a, b);
	swap2(&a, &b);//通过形参的指针就能够访问到函数外部的变量,并进行操作。

	printf("交换后:a=%d b=%d\n", a, b);
	
	return 0;
}

上面swap1swap2函数中的参数 x、y、p、q都属于形参

main函数中的传给swap1a、b,和传给swap2函数的&a、&b都属于实参

在这里插入图片描述
这里可以看到swap1函数在调用的时候,x,y拥有自己的空间,同时拥有了和实参一模一样的内容。

可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。

4. 函数的调用

4.1 传值调用

函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

前面交换两个变量内容的例子中,swap1函数就是传值操作:
在这里插入图片描述
在这里插入图片描述
上面的实例表明了,虽然在函数内改变了 a 和 b 的值,但是实际上 a 和 b 的值没有发生变化。

4.2 传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。

这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

前面的swap2函数就是传址操作:
在这里插入图片描述
在这里插入图片描述
与传值调用不同,传址调用在函数内改变了 a 和 b 的值,实际上也改变了函数外 a 和 b 的值。

5. 函数的嵌套调用和链式访问

🍩函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。

5.1 嵌套调用

函数的嵌套可以简单的理解为,在一个函数中可以调用其他函数。

🍤实例:

int sum(x, y)
{
	return x + y;
}
int test(x,y)
{
	printf("%d\n", sum(x, y));//调用sum函数
}
int main()
{
	int a = 10;
	int b = 20;
	test(a, b);
	return 0;
}

🍩函数可以嵌套调用,但是不能嵌套定义。

5.2 链式访问

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

🍤实例:

//代码1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[20] = "hello";
	int ret = strlen(strcat(arr, "bit"));//strlen函数--求字符串的长度,不包括'\0' 
	printf("%d\n", ret);
	return 0;
}
//代码2
#include <stdio.h>
int main()
{
	printf("%d", printf("%d", printf("%d", 43)));//4321
	//注:printf函数的返回值是打印在屏幕上字符的个数
	return 0;
}

在这里插入图片描述

6. 函数的声明和定义

6.1 函数声明

告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。

  • 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
  • 函数的声明一般要放在头文件中的。

如果函数在主函数main()前,不需要声明,直接调用;
如果函数在主函数之后,要先声明:

//声明格式:
返回类型 函数名(形参1,形参2,...);
//函数声明
int Add(int x, int y);
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = Add(a, b);//函数调用
	printf("%d\n", c);
	return 0;
}
//函数的定义
int Add(int x, int y)
{
	return x + y;
}

6.2 函数定义

函数的定义是指函数的具体实现,交待函数的功能实现。

//函数的定义-定义是一种特殊的声明
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = Add(a, b);//函数调用
	printf("%d\n", c);
	return 0;
}

结束语

函数是 C 语言中非常重要的概念。本文介绍了 C 语言函数的声明和定义、调用、参数等内容,希望对你有所帮助。
  不怕慢,只怕停。
  我们下一篇文章再见。
在这里插入图片描述

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

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

相关文章

select下拉框---无限滚动加载

需求&#xff1a; select的下拉框&#xff0c;后端做了分页&#xff0c;此时前段需要同步加分页 解决思路&#xff1a; 考虑到交互和性能&#xff0c;采用触底请求下一页&#xff08;无限滚动加载&#xff09; 代码示例&#xff1a; import { Select, message } from antd; im…

UE5.1.1 C++从0开始(16.作业5思路分享)

教程的链接&#xff1a;https://www.bilibili.com/video/BV1nU4y1X7iQ 总结一下这次的任务点&#xff1a; 用PlayerState来做一个Credit系统&#xff0c;需要在我们的ui内显示我们的分数更新血药对象&#xff0c;每次使用血药都会扣除相应的分数新增一个金币对象&#xff0c;…

【Python】Sphinx 文档生成器

目录 1. Sphinx 介绍 2. Sphinx 实战 2.1. 初始化 Sphinx 工程 2.2. 编译项目 2.3. Sphinx 主题 2.4. 增加 Sphinx 文档 1. Sphinx 介绍 Sphinx是一个Python文档生成器&#xff0c;它基于reStructuredText标记语言&#xff0c;可自动根据项目生成HTML,PDF等格式的文档。…

使用 OpenCV 进行按位运算和图像屏蔽

在本教程中,我们将了解如何使用按位运算 AND、OR、XOR 和 NOT。 图像处理中使用按位运算从图像中提取感兴趣区域 (ROI)。 正如您所看到的,两个矩形重叠的区域已被删除(黑色),因为在该区域中两个像素都大于 0。 按位非<

浅析代谢组学最常用到的数据分析方法 图形详解pca pls-da opls-da

代谢组学是一门对某一生物或细胞所有低分子质量代谢产物&#xff08;以相对分子质量<1000的有机和无机的代谢物为研究核心区&#xff09;进行分析的新兴学科。生物样本通过NMR、GC-MS、LC-MS等高通量仪器分析检测后&#xff0c;能产生大量的数据&#xff0c;这些数据具有高维…

网页版在线流程图绘制工具Diagram

网页地址&#xff1a;Diagram 可以将流程图保存为图片、网址等多种格式。 界面&#xff1a;

【PortAudio】PortAudio 音频处理库Demo

1. 介绍 PortAudio是一个免费、跨平台、开源的音频I/O库。看到I/O可能就想到了文件&#xff0c;但是PortAudio操作的I/O不是文件&#xff0c;而是音频设备。它能够简化C/C的音频程序的设计实现&#xff0c;能够运行在Windows、Macintosh OS X和UNIX之上&#xff08;Linux的各种…

SAP从入门到放弃系列之生产车间相关单据打印

文章目录概览 一、前言二、系统相关设置2.1、配置:1&#xff1a;2.2、配置点2&#xff1a;2.3、配置点3 三、主数据准备四、测试场景准备五、小结 一、前言 通常在项目实施的时候&#xff0c;如果没有MES&#xff0c;那么生产调度相关岗位下达订单后&#xff08;订单下达感觉没…

K8s部署微服务(springboot+vue)

文章目录 前言一、使用到的K8s资源1.1 Deployment1.2 Service 二、Springboot基础服务部署2.1 网关gateway2.2 鉴权auth2.3 文件file2.4 流程flow2.5 消息message2.6 组织org2.7 系统通用system2.8 用户user2.9 Node 三、Vue前端部署3.1 项目前端nginx3.2 静态资源服务nginx 四…

迪杰斯特拉算法(求最短路径)

迪杰斯特拉算法&#xff08;求最短路径&#xff09; 迪杰斯特拉算法用于查找图中某个顶点到其它所有顶点的最短路径&#xff0c;该算法既适用于无向加权图&#xff0c;也适用于有向加权图。 注意&#xff0c;使用迪杰斯特拉算法查找最短路径时&#xff0c;必须保证图中所有边…

相对位置编码(二) Relative Positional Encodings - Transformer-XL

1. Motivation 在Transformer-XL中&#xff0c;由于设计了segments&#xff0c;如果仍采用transformer模型中的绝对位置编码的话&#xff0c;将不能区分处不同segments内同样相对位置的词的先后顺序。 比如对于segmenti&#xfffd;&#xfffd;&#xfffd;&#xfffd;&…

pycharm安装opencv-python报错

问题一 通过pycharm中的Terminal窗口安装opencv-python错误如下&#xff1a; 上图所示为部分错误&#xff0c;全部错误如下&#xff1a; Building wheel for opencv-contrib-python (PEP 517) ... errorERROR: Complete output from command D:\anzhuanglujing\Anaconda\python…

从零开始之PID控制

从零开始系列之PID控制&#xff0c;宗旨就是以说人话的方式讲述它&#xff0c;真正的做到从零开始&#xff0c;小白一看就会&#xff0c;一学就废。 一、什么是PID控制&#xff1f; PID控制&#xff08;比例-积分-微分控制&#xff09;由比例单元&#xff08;Proportional&…

玩耍的猫咪【 InsCode Stable Diffusion 美图活动一期】

1️⃣ 工具介绍 InsCode是一个集成了在线IDE、在线AI编程、在线算力租赁、在线项目部署以及在线SD 模型使用的综合代码开发平台。 Stable Diffusion是目前最火的AI绘画工具之一&#xff0c;它是一个免费开源的项目。通过Stable Diffusion&#xff0c;可以很轻松的通过文字描述…

上半年结束,下半年继续冲!

前言: 这周直播也把雷神写的Ffmpeg推流器讲解完了&#xff0c;而一同时&#xff0c;一转眼间&#xff0c;2023年已经过半&#xff0c;正式进入了下半年&#xff1a; 因为上半年已经开始在做解析Ffmpeg 最新版本的源码&#xff0c;所以下半年&#xff0c;我会继续坚持讲解Ffmpeg…

“GPT+健康医疗”赋能医疗行业“数智化”发展,景联文科技提供高质量医疗数据库

近日&#xff0c;ChatGPT这个代表着通用版的大型语言模型以其出色的表现在全球互联网上引人注目。它所使用的GPT技术基础为人工智能应用开启了全新的世界。 “大模型时代已经到来。它已变成基础设施&#xff0c;变成算力&#xff0c;变成生产力。大模型可能有通用技术&#xf…

C++杂谈-友元和操作符重载

1、友元- friend 我的理解&#xff1a;通过设置友元函数和友元类来让外部函数来访问私有成员&#xff0c;这样虽然破坏了类的封装型和隐藏性&#xff0c;但是提高了程序的运行效率&#xff08;减少了某些安全性检查的过程&#xff09;。 友元函数和友元类统称友元&#xff0c;…

Nginx+Tomcat(多实例)实现动静分离和负载均衡(四层、七层)

目录 一、Tomcat 多实例部署 二、反向代理的两种类型 三、NginxTomcat实现负载均衡和动静分离&#xff08;七层代理&#xff09; 1.动静分离和负载均衡原理 2.实现方法 3.部署实例 &#xff08;1&#xff09;部署Nginx负载均衡服务器 &#xff08;2&#xff09;配置Tom…

C++之GNU C的__attribute__常用属性(一百五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

使用 ZBrush、Ornatrix 和 Substance 3D Painter 重现哈利波特中的凤凰

今天瑞云渲染小编给大家带来了Ramn Tapia 分享 Phoenix 项目背后的工作流程&#xff0c;解释了如何在 Ornatrix 中完成修饰&#xff0c;并展示了纹理化过程。 介绍 你好&#xff0c;有创造力的读者朋友们 我的名字是Ramn&#xff0c;但在数字艺术领域&#xff0c;我的名字是ra…