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

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期

知识要点:变量的作用域和生存期

视频:

目录

一、任务分析

二、必备知识与理论

三、任务实施


一、任务分析

有一个一维数组,内放 10 个学生成绩,写一个函数,求出平均分、最高分和最低分。

任务要求用一个函数来完成一组数据中求平均分、最高分和最低分。也就是说希望从函数得到三个结果值,除了可以得到一个函数的返回值以外,还可以利用全局变量得到另外两个值。

二、必备知识与理论

1. 变量的作用域

C语言中变量可以在三种基本位置加以定义:函数内部、函数参数中及所有函数外部,不同的定义范围决定了变量有不同的作用域。变量的作用域是变量在程序中可以有效索引、适当操作的特定区域,也就是作用范围。根据变量的作用范围不同,变量可以分为局部变量和全局变量。

(1)局部变量

局部变量也称为内部变量,该变量是在一个函数内部定义说明的,其作用域仅限于函数内有效,即只有在本函数内才能使用它们,在此函数以外是不能使用的,称之为“局部变量”。

(2)全局变量

全局变量也称为外部变量,该变量在函数外部定义说明。它不属于哪一个函数,而属于一个源程序文件,故全局变量可以为本文件中其它函数所共用。全局变量的位置可以在文件的开头所有函数之前,也可以在两函数之间,甚至在文件的末尾所有函数之后。它的作用域为:从定义变量的位置开始到本源文件结束。

关于全局变量的作用域还要说明以下几点:

(1)全局变量可加强函数模块之间的数据联系。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其它函数,相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道,从函数中得到一个以上的返回值。

(2)建议在不必要时不要使用全局变量,因为:

①全局变量在程序的整个执行过程中都占用内存,而不是仅在需要时才开辟内存单元。

②它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。

③使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时 各个外部变量的值。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。

(3)在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量被“屏蔽”,即不起作用。

【例5.10】全局变量与局部变量同名。

#include <stdio.h>

int y=5;

void f1()

{ y=8;  /*此处是对全局变量y赋值,f1()函数中没有定义任何变量*/

printf("y=%d\n",y);

}

main()

{ int y;

y=3;

  f1();

printf("y=%d\n",y);  /*输出的是main()函数中定义的局部变量y的值*/

}

程序的运行结果为:

y=8

y=3

注意,此例中定义了两个y,一个是全局变量y,定义时被初始化为5,在f1()函数中又被赋值为8,所以在f1()函数中输出的是全局变量y的值,“y=8”。一个是定义在main()函数中的局部变量y,这两个y也只是名称相同的两个不同实体。所以在main()函数中输出的y值是3。

2.变量的生存期

根据前面介绍,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从变量值存在的时间(即生存期)角度来分,可以分为静态存储变量和动态存储变量。

所谓静态存储方式,是指在程序运行期间分配固定的存储空间的方式。而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。

(1)静态存储变量:存放在内存静态存储区中的变量称为静态存储变量。如果在定义静态存储变量时没赋初值,编译系统自动给静态变量赋初值为0。

(2)动态存储变量:存放在内存动态存储区中的变量称为动态存储变量。生存期和作用域是从时间和空间这两个不同角度来描述变量的特性,这两者既有联 系,又有区别,一个变量究竟属于哪一种存储方式,并不能仅从其作用域来判断,还应明确其存储类型说明。

3.变量的存储类别

C语言中的变量和函数都有两个属性:数据类型和存储类别。数据类型决定给数据分配的内存以及操作。存储类别是指数据在内存中的存放位置。对于数据类型,读者已熟悉,在定义一个变量时首先定义数据类型,实际上,还应该定义它的存储类别。变量的存储类别决定了变量的生存期以及给它分配在哪个存储区。

C语言中变量的存储类别共有4种:

(1)自动存储类型

自动变量的类型说明符为auto,这种存储类型是C语言程序中使用最广泛的一种类型。自动变量一般为函数或复合语句内定义的变量(包括形参)。C语言规定,函数内凡未加存储类别说明的变量均视为自动变量,也就是说自动变量可省去说明符auto。在前面程序中所定义的变量都是自动变量。

(2)寄存器存储类型

一般情况下,程序运行时各变量的值是存放在内存中的。如要对某变量进行访问,由控制器发出指令将该变量的值从内存中读到运算器中进行运算。如果变量在程序运行中使用非常频繁,则存取该变量要消耗很多时间,为提高执行效率,C语言允许将局部变量的值存放在CPU的寄存器中,称为寄存器变量。寄存器变量占用CPU的高速寄存器,不占用内存单元,使用时不需要访问内存,寄存器的读写速度比内存读写速度快,因此,可以将程序中使用频率高的变量(如控制循环次数的变量)定义为寄存器变量,这样可提高程序的执行速度。寄存器变量用关键字register作存储类别标识符。 

(3)静态存储类型

静态变量的类型说明符是static,静态变量属于静态存储方式。

①静态局部变量:在局部变量的说明前加上static说明符就构成静态局部变量。

静态局部变量属于静态存储方式,它具有以下特点:

1)静态局部变量在函数内定义,但不像自动变量那样,在调用时存在,退出函数时就消失。静态局部变量始终存在着,数据的值有继承性,每次进行函数调用时可以保存原有数据的值,也就是说它的生存期为整个源程序。

2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能在其它的函数中使用此变量。

3)对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而对自动 变量赋初值,不是在编译时进行的,而是在函数调用时进行的。每调用一次函数重新赋一次初值,相当于执行一次赋值语句。

4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。

②静态全局变量:在函数外定义的变量若没有用static说明,则是全局变量(外部变量)。全局变量的类型说明之前再加以static就构成了静态的全局变量。

(4)外部存储类型

如果在一源文件中将某些变量定义为全局变量,而这些全局变量允许其它源文件中的函数引用,就需要把程序的全局变量告诉所有的模块文件。解决的办法是,在一个模块文件中将变量定义为全局变量,而在其它模块文件中,用extern来说明这些变量。

三、任务实施

本任务是有一个一维数组,内放10个学生成绩,写一个函数,求出平均分,最高分和最低分。

任务要求用一个函数来完成一组数据中求平均分、最高分和最低分。也就是说希望从函数得到三个结果值,除了可以得到一个函数的返回值以外,还可以利用全局变量得到另外两个值。

(1)首先是定义两个全局变量来存放最高分和最低分。

(2)自己定义一个有参函数average()用来完成求10个学生的平均分这个功能并且将平均分作为返回值返回到main()函数中。

(3)在main()函数中调用average()函数完成任务。

程序代码如下:

#include <stdio.h>float max=0,min=0;float average(float array[],int n)   /* 定义函数,形参为数组 */{ int i; float aver,sum=array[0];max=min=array[0];for(i=1;i<n;i++){if(array[i]>max) max=array[i];else if(array[i]<min) min=array[i];sum=sum+array[i];}aver=sum/n;return(aver);}main()   /* 主函数 */{ float ave,score[10];int i;for(i=0;i<10;i++)scanf("%f",&score[i]);ave=average(score,10); /* 调用average函数,将得到的值赋给ave */printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}

程序的运行结果为:

99 45 78 97 100 67.5 89 92 66 43↙

max=100.00

min= 43.00

average= 77.65

可以看出array和n的值由main提供,单向传递,函数average中aver的值传回main函数,也是单向的,max和min是全局变量,它的值既可以传入函数内,也可从函数传出去。

由此可见,可利用全局变量以减少函数实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗。

相关文章:

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期

知识要点&#xff1a;变量的作用域和生存期 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 有一个一维数组&#xff0c;内放 10 个学生成绩&#xff0c;写一个函数&#xff0c;求出平均分、最高分和最低分。 任务要求用一个函数来完…...

用 Sass 模块化系统取代全局导入,消除 1.80.0 引入的 @import 弃用警告

目录 前言 问题 import 的缺陷 命名冲突 重复导入 模块系统 use 规则 forward 规则 实际修改 前言 最初&#xff0c;Sass 使用 import 规则通过单个全局命名空间加载其他文件&#xff0c;所有内置函数也可全局使用。由于模块系统&#xff08;use 和 forward 规则&…...

安卓低功耗蓝牙BLE官方开发例程(JAVA)翻译注释版

官方原文链接 https://developer.android.com/develop/connectivity/bluetooth/ble/ble-overview?hlzh-cn 目录 低功耗蓝牙 基础知识 关键术语和概念 角色和职责 查找 BLE 设备 连接到 GATT 服务器 设置绑定服务 设置 BluetoothAdapter 连接到设备 声明 GATT 回…...

搭建fastapi项目

环境准备 # 创建项目目录 mkdir my_fastapi_project cd my_fastapi_project# 创建和激活虚拟环境 python -m venv venv .\venv\Scripts\activate安装必要的包 pip install fastapi uvicorn python-dotenv创建项目基本结构 my_fastapi_project/ │ .env # …...

Maven学习(Maven项目模块化。模块间“继承“机制。父(工程),子项目(模块)间聚合)

目录 一、Maven项目模块化&#xff1f; &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;汽车模块化生产再聚合组装。 &#xff08;3&#xff09;Maven项目模块化图解。 1、maven_parent。 2、maven_pojo。 3、maven_dao。 4、maven_service。 5、maven_web。 6…...

华为云云原生中间件DCS DMS 通过中国信通院与全球IPv6测试中心双重能力检测

近日&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;与全球IPv6测试中心相继宣布&#xff0c;华为云的分布式缓存服务&#xff08;Distributed Cache Service&#xff0c;简称DCS&#xff09;和分布式消息服务&#xff08;Distributed Message …...

PostgreSQL中事件触发器Event Trigger

在PostgreSQL中&#xff0c;事件触发器&#xff08;Event Trigger&#xff09;是一种特殊的触发器类型&#xff0c;它允许你在特定的数据库系统事件发生时执行特定的操作。与普通的触发器不同&#xff0c;事件触发器并不与特定的表或视图相关联&#xff0c;而是与数据库级别的全…...

uni.request流式(Stream)请求,实现打印机效果

最近使用扣子 - 开发指南 (coze.cn)和智谱AI开放平台开发小程序AI导诊和用药对话指南。 开发的过程中也是走了不少坑,下面就来聊聊走了哪些坑。 坑1 :coze试了v2和v3的接口,两个接口请求还是有点差别的,v2拿到了botId和accessToken可以直接请求不需要做任何处理,v3还需要…...

canvas保存图片

需求&#xff1a;上面有几个按钮&#xff0c;其中有一个切换是图片 用v-if会导致图片加载慢 实现方法&#xff1a; 一进来就加载&#xff0c;通过监听元素显示&#xff0c;用于控制canvas的宽高&#xff0c;从而达到隐藏的效果 组件dowolad.vue <template><view …...

DNS到底有什么用?

举个例子&#xff0c;对于我们来说访问的域名是www.baidu.com&#xff0c;但是实际在计算机并不认识这个域名&#xff0c;计算机是需要通过IP地址去访问这个网站&#xff0c;所以呢&#xff1f;这个时候就需要一个dns解析器&#xff0c;来把这串域名转换为IP地址给计算机去访问…...

什么是CRM系统?CRM系统的功能、操作流程、生命周期

CRM系统作为企业管理和维护客户关系的重要工具&#xff0c;在商业活动中扮演着越来越重要的角色。今天&#xff0c;就让我们一起揭开它的神秘面纱&#xff0c;看看这个“幕后英雄”到底是怎么工作的。 什么是CRM系统&#xff1f; 首先&#xff0c;我们要了解什么是CRM。简单来…...

美畅物联丨JS播放器录像功能:从技术到应用的全面解析

畅联云平台的JS播放器是一款功能十分强大的视频汇聚平台播放工具&#xff0c;它已经具备众多实用功能&#xff0c;像实时播放、历史录像回放、云台控制、倍速播放、录像记录、音频播放、画面放大、全屏展示、截图捕捉等等。这些功能构建起了一个高效、灵活且用户友好的播放环境…...

我们来学mysql -- 事务并发之不可重复读(原理篇)

事务并发之不可重复读 题记不可重复读系列文章 题记 在《事务之概念》提到事务对应现实世界的状态转换&#xff0c;这个过程要满足4个特性这世界&#xff0c;真理只在大炮射程之类&#xff0c;通往和平的道路&#xff0c;非“常人”可以驾驭一个人生活按部就班&#xff0c;人多…...

ABAQUS进行焊接仿真分析(含子程序)

0 前言 焊接技术作为现代制造业中的重要连接工艺,广泛应用于汽车、船舶、航空航天、能源等多个行业。焊接接头的质量和性能直接影响到结构件的安全性、可靠性和使用寿命。因此,在焊接过程中如何有效预测和优化焊接过程中的热效应、应力变化以及材料变形等问题,成为了焊接研…...

BAPI_GOODSMVT_CREATE物料凭证增强字段

目的&#xff1a;增加字段LSMNG LSMEH的赋值 项目MSEG 的 BAPI 表增强结构 BAPI_TE_XMSEG 抬头MKPF 的 BAIP 表增强 BAPI_TE_XMKPF 1. 在结构BAPI_TE_XMSEG中appending structure附加结构 ZMSEG_001&#xff0c;增加字段LSMNG&#xff0c; LSMEH In The method IF_EX_MB_H…...

tomcat的优化和动静分离

tomcat的优化 1.tomcat的配置优化 2.操作系统的内核优化 注意&#xff1a;设置保存后&#xff0c;需要重新ssh连接才会看到配置更改的变化 vim /etc/security/limits.conf # 65535 为Linux系统最大打开文件数 * soft nproc 65535 * hard nproc 65535 * soft nofile 65535 *…...

[ShaderLab] 【Unity】【图像编程】理解 Unity Shader 的结构

在计算机图形学领域,开发者经常面临着管理着色器复杂性的挑战。正如大卫惠勒(David Wheeler)所说:“计算机科学中的任何问题都可以通过增加一层抽象来解决。” Unity 提供了这样一层抽象,即 ShaderLab,它通过组织和定义渲染过程的各个步骤,简化了编写着色器的过程。 什…...

vue的前端架构 介绍各自的优缺点

Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;可以根据项目的复杂性和需求选择不同的前端架构。以下是几种常见的 Vue 前端架构及其优缺点&#xff1a; 1. 单页应用 (SPA) 单页应用&#xff08;Single Page Application&#xff0c;简称 SPA&#xff09;是一种现代…...

可信AI与零知识证明的概念

可信AI 可信AI是指人工智能的设计、开发和部署遵循一系列原则和方法,以确保其行为和决策是可靠、可解释、公平、安全且符合人类价值观和社会利益的.以下是关于可信AI的举例说明、实现方式及主流方案: 举例说明 医疗诊断领域:一个可信AI的医疗诊断系统,不仅能够准确地识别…...

JavaScript逆向时,常用的11个hook

提示:记录工作中遇到的需求及解决办法 文章目录 前言01、dom操作02、Cookie操作03、事件监听操作04、AJAX拦截操作05、函数替换操作06、Header操作07、URL操作08、JSON.stringify操作09、JSON.parse操作10、eval操作11、Function操作前言 在逆向分析JavaScript代码时,开发者…...

PCL点云库入门——PCL库可视化之CloudViewer类简单点云信息显示

1、前言 可视化&#xff08;visualization&#xff09;涉及运用计算机图形学和图像处理技术&#xff0c;将数据转换成图像并在屏幕上展示&#xff0c;同时支持交互式处理。在PCL库中&#xff0c;一系列强大的可视化工具可供使用&#xff0c;其中较为流行的包括CloudViewer和PCL…...

C++ 【衔接篇】

大名鼎鼎的c实际上是由c语言扩展而来的&#xff0c;它最初是由本贾尼在20世纪80年代开发。目的是支持面向对象编程&#xff0c;同时保持c语言高效和可移植等优点。c是c的扩展&#xff0c;在一定程度上解决了c语言在特殊场景下的使用局限。 1、命名空间 在详细说明命名空间之前…...

qcreator 调试原理

在 Qt 开发中&#xff0c;Qt Creator 是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发 Qt 应用程序。Qt Creator 提供了强大的调试功能&#xff0c;可以帮助开发者高效地调试 C、QML 等语言的应用程序。Qt Creator 支持多种调试工具&#xff0c;包括基于 G…...

Windows 系统中的组策略编辑器如何打开?

组策略是 Windows 操作系统中用于设置计算机和用户配置的重要工具。它允许管理员控制各种系统功能&#xff0c;从桌面背景到安全设置等。对于 Windows 专业版、企业版和教育版用户来说&#xff0c;可以通过组策略编辑器&#xff08;Group Policy Editor&#xff09;来管理这些设…...

scala的泛型类

泛型&#xff1a;类型参数化 泛型类指的是把泛型定义到类的声明上, 即:该类中的成员的参数类型是由泛型来决定的. 在创建对象时, 明确具体的数据类型. 定义格式: class 类名&#xff08;成员名&#xff1a;数据类型&#xff09; class 类名[泛型名](成员名:泛型名) 参考代…...

基于Couchbase的数据构建方案:数仓分层

初步方案是将公共层和报表层分别放在不同的bucket中&#xff0c;这种设计从存储和访问优化的角度是合理的&#xff0c;但仍有以下细节需要考虑&#xff1a; 1. 数仓公共层设计&#xff08;origin bucket&#xff09; 合理性分析&#xff1a; 将ODS、DWD、DWS层的数据放在一个b…...

信创改造-Spring Boot 项目部署至 TongWeb

打 war 包参考&#xff1a;https://blog.csdn.net/z1353095373/article/details/144330999...

supervision - 好用的计算机视觉 AI 工具库

Supervision库是一款出色的Python计算机视觉低代码工具&#xff0c;其设计初衷在于为用户提供一个便捷且高效的接口&#xff0c;用以处理数据集以及直观地展示检测结果。简化了对象检测、分类、标注、跟踪等计算机视觉的开发流程。开发者仅需加载数据集和模型&#xff0c;就能轻…...

程序的调试

一名优秀的程序员也是一名出色的侦探&#xff0c;每一次调试都是尝试破案的过程 目录 前言 一、什么是调试&#xff1f; 二、调试 1.调试是什么 2.基本步骤 三、调试注意事项 1.怎么写出易于调试的代码 assert(断言) const 2.常见错误 总结 前言 主要是怎么调试&#xff0c;调…...

使用html 和javascript 实现微信界面功能2

1.功能说明&#xff1a; 对上一篇的基础上进行了稍稍改造 主要修改点&#xff1a; 搜索功能: 在搜索框后面增加了搜索按钮。 搜索按钮调用performSearch函数来执行搜索操作。 表单形式的功能: 上传文件: 修改为表单形式&#xff0c;允许用户通过文件输入控件选择文件并上传。 …...