自学C语言-9

**

第9章 函数

**
大型程序一般会被分为若干个程序模块,每个模块实现一个特定功能 。C语言中,由函数实现子程序,由子程序实现模块功能。本章致力于使读者了解函数的概念,掌握函数的定义及调用方式;了解内部函数和外部函数的作用范围,能区分局部变量和全局变量的不同;最后能将函数应用于程序中,将程序分成不同的功能模块。本章的知识架构及重难点如下:
在这里插入图片描述

9.1 函数概述

构成C程序的基本单元是函数,函数中包含着程序的可执行代码。每个C程序的入口和出口都位于main函数中,但并不需要把所有指令都放在main函数中。一般的做法是将程序划分成若干个模块,每个模块完成一部分功能,不同的程序模块可以由不同的人来完成,从而提高软件开发的效率。这就好比是盖楼房,一栋摩天大楼是不可能靠一个人完成的,而要靠多部门、多工种之间协力完成。通常是有一个总工程师,在他的指挥下,有部门运输建筑材料,有部门建造楼房主体,还有部门粉刷内外墙涂料。编写程序的道理与盖楼是一样的,主函数就像总工程师一样,控制着整体程序的推进和执行,其中定义的其他函数就好比参与盖楼的多个部门或工种,他们要通过某种调度(函数调用)才能完成特定的功能。
	主函数可以调用其他函数,其他函数间也可以相互调用。函数可以有参数和返回值,通过它们实现数据间的传递。在主函数中调用其他函数,这些函数执行完毕之后会返回main函数中。通常把这些被调用的函数称为下层函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待的状态,直到被调用函数执行完毕。
	【例9.1】编写3个函数:做饭,钓鱼,写诗,在本实例中,定义3个函数来完成做饭、钓鱼、写诗等待定的功能,然后在主函数中调用它们。为了简化函数的功能,这里只让其输出一条提示信息。读者可通过本实例对函数有一个直观的认识。
	![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2101805495334648803ef774173c192d.png#pic_center)

在这里插入图片描述在分析本实例之前,我们先来了解一下什么是C程序源文件、库函数和用户自定义函数。
☑源文件:由一个或者多个函数组成。C语言以源程序为单位进行编译,而不是以函数为单位进行编译。
☑库函数:由C语言系统提供,用户无须定义,调用前也不必做类型说明,但需要在程序开始部分包含有该函数原型的头文件。例如,要使用能在控制台显示信息的printf函数,需在程序开始时包含stdio.h头文件;要使用字符串操作函数strlen、strcmp等时,需在程序开始时包含string.h头文件。
☑用户自定义函数:用户编写的用来实现特定功能的函数。例如,Cook、Fish和Poem函数都是自定义函数。
在本例程序中,首先包含了stdio.h头文件,然后声明了3个自定义函数,最后在主函数main中调用了这3个函数。在主函数main外,可以看到这3个函数的定义。
运行程序,显示效果如下图所示。
在这里插入图片描述

在这里插入图片描述编程训练:
训练1:盖楼房 编写3个函数,分别实现搬运建筑材料、建造楼房主体、粉刷内外墙功能,并在主函数中调用这3个函数。输出结果如下 :

执行搬运功能
执行建造功能
执行粉刷功能

在这里插入图片描述在这里插入图片描述

训练2:写情书 定义一个函数,内定为一封情书,在主函数中调用该函数,将情书内容展示出来。运行结果如下:

人生最美好的是相遇
我一生最奢侈的事
就是途中与你相遇
然后相濡以沫,共闻花香,有生之年
只诉温暖不言歾,倾心相遇,安暖相陪

在这里插入图片描述在这里插入图片描述

9.2 函数的定义和声明

C语言的库函数可以直接调用,如printf输出函数。而自定义函数则必须由用户进行定义,确定其要实现的功能,这样才能被其他函数调用。
**

9.2.1 函数的定义

**
一个函数应包括函数头和函数体。定义一个函数的语法格式如下:
在这里插入图片描述首先来看一段代码,然后通过分解,了解函数的构成。
在这里插入图片描述1.函数头
函数头是函数的入口,标志着一段函数代码的开始。函数头包括返回值类型、函数名和参数列表3个部分,如下图所示。
在这里插入图片描述☑返回值类型:函数返回值的类型,必须是C语言中的某个数据类型。这里函数的返回值将是一个int型值。
☑函数名:函数的标识符,在一个C程序中应保持唯一。因为是标识符,所以函数名要遵守标识符命名规则。这里,函数名是AddTwoNumber,可以推测出该函数的功能是两数相加求和。
☑参数列表:调用函数时,用于将主调函数中的实际参数复制到该列表对应的形式参数中。可以没有参数,也可以有多个参数。这里定义了两个int变量,表示要相加的两个数。

2.函数体

函数体位于函数头的下方位置,由一对大括号括起来,大括号决定了函数体的范围。函数要实现的特定功能,都是在函数体部分通过代码语句完成的,最后通过return语句返回实现的结果。
在上面的代码中,函数体内首先定义了一个int型变量,用来保存加法的计算结果,之后利用传递进来的参数进行加法操作,并将结果保存在result变量中,最后函数要将所得到的结果进行返回。通过这些语句的操作,实现了求解两数和的特定功能。
在定义函数时会出现以下几种特殊的情况。
☑无参函数:没有参数列表的函数。如例9.1中的Cook、Fish、Poem都是无参函数。
☑空函数:没有任何内容,也没有什么实际功能的函数。空函数的形式如下:

类型说明符	函数名()
{
}

实际开发中,有时某个函数还未编好,或者后续要拓展某个函数,这时就会先用一个空函数代替,先占个位置,待后续时机成熟再用编好的函数取代它。
注意,C语言中,函数的定义是互相平行、独立的。也就是说,函数体内不能再包含其他函数的定义。例如,下面的代码是错误的:

int main()
{
	void Display()												/*错误!不能在函数体内定义另一个函数*/
	{
			printf("I want to show the Nesting function");
	}
	return 0;
}

这里,主函数main中定义了一个Display函数,目的是输出一句提示。由于C语言不允许进行嵌套定义,因此编译时会出现如图9.3所示的错误提示。

在这里插入图片描述

9.2.2 函数的声明

在程序中编写函数时,要先对函数进行声明,再对函数进行定义。函数定义是为了让编译器知道函数的功能 ,而函数声明是为了让编译器预先知道有这么一个函数,以及函数的名称、参数、返回值类型等信息。
函数声明的一般形式如下:
返回值类型		函数名(参数列表);

要注意的是,函数声明语句的最后要用分号";"作为结尾。例如,声明一个函数的代码如下:

Int ShowNumber(int iNumber);

【例9.2】交换两个数值,通过本实例了解函数声明与函数定义的位置,及其在程序中的作用。

在这里插入图片描述(1)观察上面的程序,可以看到在main函数的开头先进行了exchange函数的声明,声明的作用是告知其函数将在后面进行定义。
(2)在main函数体中,首先定义两个整型变量a、b,之后输出一条提示消息,然后调用exchange函数。
(3)在main函数的定义之后可以看到exchange函数的定义,功能是实现两个数的数值互换。
运行程序,结果如下图所示。
在这里插入图片描述
注意:如果先定义函数,再调用函数,则不再需要进行函数声明,此时函数定义已经包含了函数声明的作用。

编程训练:
训练3:输出谚语 编写一个程序,输出“最大的挑战和突破在于用人,而用人最大的突破是信任人”。运行效果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/74ed798e2451404a96244f43bba46af4.png#pic_center
在这里插入图片描述

训练4:打印新年菜单 春节是中国最重要的节日,家家户户都会张灯结彩,丰盛的年夜饭更是必不可少的。定义一个函数,打印2021年新年菜单,再在主函数中调用函数。运行结果如下:
在这里插入图片描述

9.3 函数参数

多数情况下,主调函数和被调函数之间存在着数据传递关系,这种数据传递是通过函数参数来实现的。函数参数的作用是传递数据给函数使用,函数利用接收到的数据进行具体的操作处理。

9.3.1 形式参数与实际参数

函数的参数分为两种:形式参数和实际参数。同为参数,要仔细体会其中的区别。
1.形式参数
声明和定义函数时,函数名后面括号中的参数称为形式参数。这些参数只是定义了类型,在实际参数传入前并没有实际意义,因此叫作形式参数,简称形参。
2.实际参数
调用函数时,函数名后面括号中的参数称为实际参数。调用函数的过程就是真正使用这个函数的过程,此时调用者会传递一些要实际参与运算的参数给被调用函数,这些实际参与运算的参数就是实际参数,简称实参。
下面来看一段代码,加深对形参和实参的理解。

在这里插入图片描述上述代码定义了一个Minus函数,功能是两数相减。这里,iNumber1和iNumber2是形式参数,表示相减的两个整型数,没有具体值(等待实参传入)。主函数中,通过“iResult=Minus(9,4); "语句调用Minus函数,这里9和4这实际参数,调用函数后,将用4代替iNumber1,用9代替iNumber2,因此Minus函数实际执行的运算的是9-4。
注意,函数参数可以是常量、变量、数组、指针等,也可以是表达式。

9.3.2 数组作函数参数

1.数组元素作为函数参数

【例9.3】输出数组元素
定义一个数组并为其赋值,然后将数组元素作为函数实参进行传递。自定义函数体中,形参得到实参传递的数值后,将其显示输出。
在这里插入图片描述(1)首先进行函数声明,在主函数main中定义一个整型数组和一个整型变量i。
(2)使用for循环语句对数组中的元素依次赋值,在这里,变量i既是循环条件,也是引用数组元素的下标。
(3)通过for循环语句调用ShowMember函数,显示数据。
运行程序,显示效果如上图所示。
**

2.数组名作为函数参数

**
C语言中,数组名表示的是数组中第一个元素的地址 。因此,当数组名作为函数实参时,传递的是数组的地址。这点和数组元素做实参时是不一样的,注意体会其不同。
【9.4】数组名作为函数参数
在本实例中,使用数组名作为函数的实参和形参,实现数组的赋值和输出。
在这里插入图片描述(1)首先对Evaluate函数和Display函数进行声明,在声明语句中可以看到数组名作为形参。
(2)在主函数main中定义一个具有10个元素的整型数组iArray。
(3)调用Evaluate函数,数组名iArray作为函数实参,传递的是数组的地址。在Evaluate函数中,使用数组iArrayName作为形参,接受对应的地址空间,并对数组进行赋值操作。
(4)调用Display函数,将数组输出,可以看到在函数参数中使用的也是数组名称。运行程序,显示效果如上图所示。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024 跨境电商线下大会+Shopee专题峰会将在广州举办

随着全球化的不断深入,美妆市场和跨境电商行业正迎来前所未有的发展机遇。 在这个充满活力的领域,创新和跨界合作已成为推动行业发展的关键动力。 定于7月4日上午10:00 在广州空港博览中心举办的2024 跨境电商线下大会暨Shopee广州首届(美妆)峰会则是一…

Bigtable: A Distributed Storage System for Structured Data

2003年USENIX,出自谷歌,开启分布式大数据时代的三篇论文之一,底层依赖 GFS 存储,上层供 MapReduce 查询使用 Abstract 是一种分布式结构化数据存储管理系统,存储量级是PB级别。存储的数据类型和延时要求差异都很大。…

Java版+ SaaS应用+接口技术RESTful API 技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开

Java版 SaaS应用接口技术RESTful API WebSocket WebService技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开 医院住院管理系统(Hospital Information System简称HIS)是一门医学、信息、管理、计算机等多种学科为一体的边缘科学&#xff…

文件系统小册(FusePosixK8s csi)【3 K8s csi】

文件系统小册(Fuse&Posix&K8s csi)【3 K8s csi】 往期文章: 文件系统小册(Fuse&Posix&K8s csi)【1 Fuse】文件系统小册(Fuse&Posix&K8s csi)【2 Posix标准】 0 核心知识…

算法007:三数之和

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/3sum/ 这个题相较于前几个题来说比较难,思想是前面一个题目…

c++使用nlohmann读取json文件

下载&#xff1a; GitHub - nlohmann/json: JSON for Modern C 解压&#xff1a; 包含头文件&#xff1a; 要包含的头文件和要使用的命名空间&#xff1a; #include <nlohmann/json.hpp>using json nlohmann::json; 测试文件&#xff1a; 代码&#xff1a; #include…

从零开始学习Java多维数组,一文教会你。

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

【three.js】旋转、缩放、平移几何体

目录 一、缩放 二、平移 三、旋转 四、居中 附源码 BufferGeometry通过.scale()、.translate()、.rotateX()、.rotateY()等方法可以对几何体本身进行缩放、平移、旋转,这些方法本质上都是改变几何体的顶点数据。 我们先创建一个平面物体,样子是这样的。 一、缩放 // 几何…

DELL服务器插入新磁盘、创建虚拟磁盘、挂载磁盘步骤

文章目录 一、磁盘清理&#xff08;可选&#xff0c;针对新硬盘是Foreign状态&#xff09;1、进入VD Mgmt2、清理新硬盘配置 二、创建虚拟磁盘1、进入Device Settings2、创建虚拟磁盘 三、挂载磁盘到系统1、分区磁盘&#xff08;注意实际磁盘的名称&#xff09;2、格式化分区3、…

快慢指针在字符串中的应用-443. 压缩字符串

题目链接及描述 443. 压缩字符串 - 力扣&#xff08;LeetCode&#xff09; 题目分析 这个题目总体不算太难&#xff0c;如果之前接触过双指针&#xff08;快慢指针&#xff09;的话&#xff0c;比较好做。题目可以理解为计算数组中对应各个连续字符出现的次数&#xff0c;并将…

8.22 PowerBI系列之DAX函数专题-盈亏平衡分析

需求 实现 一、用参数设置固定成本&#xff0c;单位变动成本&#xff0c;与毛利率 1 单位变动成本 generateseries(0,100,1) 2 固定成本 generateseries(0,50000,1) 3 毛利率 generateseries(0,0.4,0.01) 二、度量值 1 总变动成本 [单位变动成本 值]*[销量 值] 2 总成本…

除了英伟达,这些AI概念公司在2024年还有巨大的投资价值(五)

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经在英伟达还没拆股前&#xff0c;股价还是100多美元时&#xff08;2019年&#xff09;就曾多次公开发布文章呼吁大家关注并投资英伟达&#xff0c;以下是猛兽财经在2019年到2022年间公开发布的关于英伟达的部分文…

基于matlab的MTCNN(多任务卷积神经网络)人脸检测算法

关键词&#xff1a;Matlab&#xff1b;深度学习&#xff1b;多任务卷积神经网络&#xff1b;人脸检测&#xff1b; 背景 在不受约束的环境中&#xff0c;由于个体姿势的多样性、光照条件的变化以及潜在的遮挡问题&#xff0c;人脸检测和对齐任务面临诸多挑战。近期的研究表明…

el-table表头文字换行或者修改字体颜色样式

例如 <el-table:data"tableData":header-cell-style"headClass" style"width: 100%;" border ><el-table-columnprop"address"label"生产工序"align"center"></el-table-column> //重点看这里…

操作系统 c语言模仿 磁盘文件操作

1&#xff0e;实验目的 深入了解磁盘文件系统的实现。 2&#xff0e;实验预备知识 文件的操作&#xff1b; 文件的逻辑结构和物理结构&#xff1b; 磁盘空间的管理&#xff1b; 磁盘目录结构。 3&#xff0e;实验内容 设计一个简单的文件系统&#xff0c;用文件模拟磁盘&…

手机上安装AI模型是一种什么体验?

昨天参加微软的AI DAY活动&#xff0c;看到微软的技术大佬分享了一个场景&#xff0c;就是坐飞机从上海到北京&#xff0c;机长广播因为天气原因&#xff0c;飞机需要盲降&#xff0c;他说当时听到盲降第一反应感觉有点恐慌&#xff0c;但是因为飞机上受限于网络环境&#xff0…

Stable Diffusion入门指南(看完必会)超全面

作者&#xff1a;SuMu 链接&#xff1a;https://zhuanlan.zhihu.com/p/703196651 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 今天写这个帖子是带大家了解一款强大的 AI 绘画工具——Stable Diffusion&#xff…

QT day02

思维导图 UI界面设计 设置登录界面&#xff0c;输入账号、密码&#xff0c;登录/取消 按钮 使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义…

Linux x86_64 BIOS 启动

文章目录 前言一、BIOS简介二、MBR三、Linux BIOS 启动3.1 BIOS stage3.2 Boot Loader Stage3.2.1 boot.img3.2.2 core.img3.2.3 *.mod 3.3 Kernel Stage 参考资料 前言 本文以 centos 6/7 &#xff08;2.6.32/3.10.0 &#xff09;&#xff0c;x86_64平台为例。 固件保存在主…

传统后端SQL数据层替代解决方案: 内置数据源+JdbcTemplate+H2数据库 详解

内置数据源 我们回顾一下druid数据源的配置方式 通过type属性指定数据源的类型 导入依赖 starter就使用了spring的自动装配功能 格式二是在引入druid的依赖的基础上 进行的一种配置方式 Tomcat内部也可以进行数据源的配置 轻量级中最快的数据源对象 我们切换德鲁伊连接池 我…