自学C语言-9
**
第9章 函数
**
大型程序一般会被分为若干个程序模块,每个模块实现一个特定功能 。C语言中,由函数实现子程序,由子程序实现模块功能。本章致力于使读者了解函数的概念,掌握函数的定义及调用方式;了解内部函数和外部函数的作用范围,能区分局部变量和全局变量的不同;最后能将函数应用于程序中,将程序分成不同的功能模块。本章的知识架构及重难点如下:
9.1 函数概述
构成C程序的基本单元是函数,函数中包含着程序的可执行代码。每个C程序的入口和出口都位于main函数中,但并不需要把所有指令都放在main函数中。一般的做法是将程序划分成若干个模块,每个模块完成一部分功能,不同的程序模块可以由不同的人来完成,从而提高软件开发的效率。这就好比是盖楼房,一栋摩天大楼是不可能靠一个人完成的,而要靠多部门、多工种之间协力完成。通常是有一个总工程师,在他的指挥下,有部门运输建筑材料,有部门建造楼房主体,还有部门粉刷内外墙涂料。编写程序的道理与盖楼是一样的,主函数就像总工程师一样,控制着整体程序的推进和执行,其中定义的其他函数就好比参与盖楼的多个部门或工种,他们要通过某种调度(函数调用)才能完成特定的功能。主函数可以调用其他函数,其他函数间也可以相互调用。函数可以有参数和返回值,通过它们实现数据间的传递。在主函数中调用其他函数,这些函数执行完毕之后会返回main函数中。通常把这些被调用的函数称为下层函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待的状态,直到被调用函数执行完毕。【例9.1】编写3个函数:做饭,钓鱼,写诗,在本实例中,定义3个函数来完成做饭、钓鱼、写诗等待定的功能,然后在主函数中调用它们。为了简化函数的功能,这里只让其输出一条提示信息。读者可通过本实例对函数有一个直观的认识。
在分析本实例之前,我们先来了解一下什么是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:输出谚语 编写一个程序,输出“最大的挑战和突破在于用人,而用人最大的突破是信任人”。运行效果如下:
。主函数中,通过“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函数,将数组输出,可以看到在函数参数中使用的也是数组名称。运行程序,显示效果如上图所示。
相关文章:

自学C语言-9
** 第9章 函数 ** 大型程序一般会被分为若干个程序模块,每个模块实现一个特定功能 。C语言中,由函数实现子程序,由子程序实现模块功能。本章致力于使读者了解函数的概念,掌握函数的定义及调用方式;了解内部函数和外部…...

NVIDIA Triton系列01-应用概论
NVIDIA Triton系列01-应用概论 推理识别是人工智能最重要的落地应用,其他与深度学习相关的数据收集、标注、模型训练等工作,都是为了得到更好的最终推理性能与效果。 几乎每一种深度学习框架都能执行个别的推理工作,包括 Tensorflow、Pytorc…...

LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码 LIMS实验室信息管理系统,是一种基于计算机硬件和数据库技术,集多个功能模块为一体的信息管理系统。该系统主…...

Web前端进国企:挑战与机遇并存
Web前端进国企:挑战与机遇并存 随着互联网的飞速发展,Web前端技术已经成为企业信息化建设的重要组成部分。对于许多热衷于前端技术的年轻人来说,进入国企工作既是一种挑战,也是一种机遇。本文将从四个方面、五个方面、六个方面和…...

快速上手SpringBoot
黑马程序员Spring Boot2 文章目录 1、SpringBoot 入门程序开发1.1 创建一个新的项目 2、浅谈入门程序工作原理2.1 parent2.2 starter2.3 引导类2.4 内嵌tomcat 1、SpringBoot 入门程序开发 1.1 创建一个新的项目 file > new > project > empty Project 创建新模块&a…...

SQL 快速参考
SQL 快速参考 SQL(Structured Query Language)是一种用于管理关系数据库管理系统(RDBMS)的标准编程语言。它用于执行各种操作,如查询、更新、插入和删除数据库中的数据。本快速参考将提供SQL的基本语法和常用命令&…...

Cask ‘oraclexxx‘ is unavailable: No Cask with this name exists.
brew search oracle-jdk或brew search --cask oracle-jdk 原因:Homebrew官方仓库不再维护多个旧版本的OracleJDK 不推荐使用Homebrew环境安装JDK //指定版本安装 brew install --cask temurin17 //设置 JAVA_HOME 环境变量 //找到安装的JDK 版本的路径 /usr/lib…...

2024年武汉市中级、高级职称水测考试开卷方法分享
2024年武汉市(除开东湖高新区外)职称首次组织全员水测,先考水测后报名,水测报名在5月16号截止。 武汉市水测组织形式: 武汉市2024年专业技术职务水平能力测试分为笔试和面试,面试答辩有关事项另行通知&…...

计算机网络(6) ICMP协议
ICMP(Internet Control Message Protocol,互联网控制消息协议)是一种用于在IP网络中传递控制消息和错误报告的协议。ICMP是IP协议族的一部分,尽管它并不用于传输用户数据,但它在网络诊断和管理中起着关键作用。以下是关…...

FuTalk设计周刊-Vol.036
🔥AI漫谈 热点捕手 1、Stable Zero123:从单张图像生成高质量 3D 对象 Stable Zero123 可以生成物体的新颖视图,展示从各个角度对物体外观的 3D 理解,由于训练数据集和高程条件的改进,其质量比 Zero1-to-3 或 Zero123-XL 显著提高…...

Java——面向对象进阶(三)
前言: 抽象类,接口,内部类 文章目录 一、抽象类1.1 抽象方法1.2 抽象类1.3 抽象类的使用 二、 接口2.1 接口的定义和实现2.2 default 关键字2.3 实现接口时遇到的问题 三、内部类3.1 成员内部类3.2 静态内部类3.3 成员内部类3.4 匿名内部类&a…...

鸿蒙开发电话服务:【@ohos.telephony.observer (observer)】
observer 说明: 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import observer from ohos.telephony.observerobserver.on(‘networkStateChange’) on(type: ‘networkStateChange’, ca…...

希亦、追觅、云鲸洗地机:究竟有何不同?选择哪款更合适
最近收到很多私信里,要求洗地机测评的呼声特别高,作为宠粉的测评博主,当然是马上安排起来,满足大家对想看洗地机的愿望。这次洗地机测评,我挑选了三款热门的品牌型号,并从多个维度对它们进行使用测评&#…...

代码随想录算法训练营第二十六天
题目:455. 分发饼干 贪心第一题 这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。或者小饼干先喂饱小胃口 首先要对 g 和 s进行排序这样才能知道最大的胃口和最大的饼干然后进行遍历即可…...

[面试题]Java【并发】
[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL 因为 Java 并发涉及到的内容会非常多,本面试题可能很难覆盖到所有的知识点,所以推荐 《Java并发编程的艺术》 。 Java 线程 线程 通知 等待 线…...

基于VSCode和MinGW-w64搭建LVGL模拟开发环境
目录 概述 1 运行环境 1.1 版本信息 1.2 软件安装 1.2.1 下载安装VS Code 1.2.1.1 下载软件 1.2.1.1 安装软件 1.2.2 下载安装MinGW-w64 1.2.2.1 下载软件 1.2.2.2 安装软件 1.2.3 下载安装SDL 1.2.3.1 下载软件 1.2.3.2 安装软件 1.2.4 下载安装CMake 1.2.4.…...

H5112B 降压恒流芯片12V24V36V48V60V72V100V 1.2ALED 调光无频闪光滑细腻
H5112B多功能LED恒流驱动器是一款具有良好性能与高度集成度的驱动芯片。以下是该产品的主要优点及应用领域的详细分析: 产品优点: 宽电压输入范围:H5112B支持5V至90V的宽电压输入范围,使其能够适应多种不同的电源环境࿰…...

真心建议大家冲一冲新兴领域,工资高前景好【大模型NLP开发篇】
前言 从ChatGPT到新近的GPT-4,GPT模型的发展表明,AI正在向着“类⼈化”⽅向迅速发展。 GPT-4具备深度阅读和识图能⼒,能够出⾊地通过专业考试并完成复杂指令,向⼈类引以为傲的“创造⼒”发起挑战。 现有的就业结构即将发⽣重⼤变…...

深度剖析淘宝扭蛋机源码:打造趣味性电商活动的秘诀
在当今电商市场中,如何吸引用户的注意力、提升用户的参与度成为了各大电商平台竞相追求的目标。淘宝扭蛋机作为一种新型的电商活动形式,以其趣味性和互动性深受用户喜爱。本文将深度剖析淘宝扭蛋机源码,探讨其如何打造趣味性与互动性并存的电…...

vue3+优化vue-baidu-map中marker点过多导致的页面卡顿问题
场景: 移动端h5中,当我们需要在地图中展示很多marker点坐标的时候,通常会使用 bm-marker ,去循环生成marker点,在数量不多的情况下是没问题的,但是随着数据量的增加,地图就会变得卡顿,以及渲染延…...

PMS助力制造企业高效运营︱PMO大会
全国PMO专业人士年度盛会 北京易贝恩项目管理科技有限公司副总经理朱洪泽女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾,演讲议题为“PMS助力制造企业高效运营”。大会将于6月29-30日在北京举办,敬请关注! 议题简要: …...

认识一些分布-关于极值点分布的一些知识
可以参考下面资料: Extreme Value Distribution & the Extreme Value Theory - Statistics How To...

Anaconda环境安装失败的解决方案
链接步骤的补充。 为了运行marlib,需要一个全新的Anaconda环境。但是,不想把文件安装在C盘,会造成空间不足。于是试着在.condarc文件里面改动了路径,具体如图。 上图中,在defaults前面添加了D盘的路径作为安装路径。 …...

mac 本地启动rocketmq
Mac 本地起rocketmq 官网下载:RocketMq官网下载地址 下载后解压 如果电脑配置不高或者不希望rocketmq占用太大内存的,修改配置/bin/runbroker.sh JAVA_OPT"${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"-Xmx4g 初始堆大小 4g -Xms4g 最大…...

数据资产管理的未来趋势:洞察技术前沿,探讨数据资产管理在云计算、大数据、区块链等新技术下的发展趋势
一、引言 随着信息技术的飞速发展,数据已成为企业最重要的资产之一。数据资产管理作为企业核心竞争力的关键组成部分,其发展趋势和技术创新受到了广泛关注。特别是在云计算、大数据、区块链等新技术不断涌现的背景下,数据资产管理面临着前所…...

lwip中server和client的socket、地址和端口号
1、server的socket通过lwip_socket建立: server_sd lwip_socket(AF_INET, SOCK_STREAM, 0);2、client的socket在监听到连接后建立: client_sd lwip_accept(server_sd, (struct sockaddr *)&client_addr_port, (socklen_t *)&size);3、server…...

代码随想录算法训练营Day38|动态规划理论基础、2.斐波那契数、3.爬楼梯、4.使用最小花费爬楼梯
动态规划理论基础 代码随想录 (programmercarl.com) 动态规划(Dynamic Programming,简称DP)是一种算法设计技术,它通过将复杂问题分解为更小的子问题来解决优化问题。动态规划通常用于解决那些具有重叠子问题和最优子结构特性的…...

IIC通信总线
文章目录 1. IIC总线协议1. IIC简介2. IIC时序1. 数据有效性2. 起始信号和终止信号3. 数据格式4. 应答和非应答信号5. 时钟同步6. 写数据和读数据 2. AT24C023. AT24C02读写时序4. AT24C02配置步骤5. 代码部分1. IIC基本信号2. AT24C02驱动代码3. 实验结果分析 1. IIC总线协议 …...

2024 年最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
OpenAi 环境安装 首先确保您的计算机上已经安装了 Python。您可以从 Python 官方网站下载并安装最新版本 Python。安装时,请确保勾选 “Add Python to PATH” (添加环境变量)选项,以便在 cmd 命令行中直接使用 Python。 安装 Op…...

git原理解释,windows 10 / ubuntu 24.04 安装使用 github
git的原理 git是赫赫有名的Linux之父Linus Torvalds从2005年起开发的文件版本管理系统,掌控Linux内核这样一个最为重量级的世界产品的Linus为什么要开发这个东西呢?因为Linux系统由全世界的程序员协作维护,对源代码文件的版本控制管理的需求…...