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是全局变量,它的值既可以传入函数内,也可从函数传出去。

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

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

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

相关文章

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式

学习笔记&#xff1a;从ncsi/nc-si协议和代码了解网络协议的设计范式 参考文档&#xff1a; https://www.dmtf.org/standards/published_documents https://www.dmtf.org/dsp/DSP0222 https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.2.0.pdf参考代…

2024.12.10——攻防世界Web_php_include

知识点&#xff1a;代码审计 文件包含 伪协议 伪协议知识点补充&#xff1a; 在PHP中&#xff0c;伪协议&#xff08;Pseudo Protocols&#xff09;也被称为流包装器&#xff0c;这些伪协议以 php://开头&#xff0c;后面跟着一些参数&#xff0c;用于指定要执行的操作或需要…

Wireshark如何查看数据包时间间隔

1.如果数据包量不大&#xff0c;抓包本身也不大&#xff0c;建议从绝对时间判断&#xff0c;打开wireshark软件&#xff0c;并点开相应要分析的抓包文件。 进入到最上方菜单<视图>,在弹出菜单选择时间显示格式&#xff0c;再在右侧菜单中选择自捕获经过的秒数。 这样就可…

【ChatGPT】解锁AI思维链:如何让机器像人类一样思考?

在人工智能领域&#xff0c;我们一直在追求让机器像人类一样思考。然而&#xff0c;即使是最先进的AI&#xff0c;也常常被诟病缺乏“常识”&#xff0c;难以理解复杂问题&#xff0c;更不用说像人类一样进行逻辑推理和解决问题了。最经常的表现就是遇到不会的地方&#xff0c;…

MVC基础——市场管理系统(四)

文章目录 项目地址六、EF CORE6.1 配置ef core环境6.2 code first6.2.1 创建Database context1. 添加navigation property2. 添加MarketContext上下文七、Authentication7.1 添加Identity7.2 Run DB migration for Identity7.3 使用Identity7.3.1 设置认证中间件7.3.2 设置权限…

FinClip | 2024年11月产品大事记

FinClip 的使命是使您&#xff08;业务专家和开发人员&#xff09;能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型的相关操作。不妨让我们看看在11月的产品与市场发布亮点&#xff0c;看看是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f…

华为eNSP:VRRP

一、VRRP背景概述 在现代网络环境中&#xff0c;主机通常通过默认网关进行网络通信。当默认网关出现故障时&#xff0c;网络通信会中断&#xff0c;影响业务连续性和稳定性。为了提高网络的可靠性和冗余性&#xff0c;采用虚拟路由冗余协议&#xff08;VRRP&#xff09;是一种…

安卓主板_MTK联发科android主板方案

在当前智能设备的发展中&#xff0c;安卓主板的配置灵活性和性能优化显得尤为重要。安卓主板的联发科方案&#xff0c;在芯片上&#xff0c;搭载联发科MTK6761、MT8766、MT6765、MT6762、MT8768、MT8390、MTK8370以及MT8788等型号&#xff0c;均基于64位的四核或八核架构设计。…

【论文阅读】PRIS: Practical robust invertible network for image steganography

内容简介 论文标题&#xff1a;PRIS: Practical robust invertible network for image steganography 作者&#xff1a;Hang Yang, Yitian Xu∗, Xuhua Liu∗, Xiaodong Ma∗ 发表时间&#xff1a;2024年4月11日 Engineering Applications of Artificial Intelligence 关键…

Redis应用—1.在用户数据里的应用

大纲 1.社区电商的业务闭环 2.Redis缓存架构的典型生产问题 3.用户数据在读多写少场景下的缓存设计 4.热门用户数据的缓存自动延期机制 5.缓存惊群与穿透问题的解决方案 6.缓存和数据库双写不一致问题分析 7.基于分布式锁保证缓存和数据库双写一致性 8.缓存和数据库双写…

【Tomcat】理解tomcat与Socket

目录 1. Tomcat 1.1 Tomcat帮助启动http服务器。 1.2 tomcat理解&#xff1a; 2. 计算机网络最基本的流程 2.1 信息是怎么来的&#xff1f; 2.2 端口是干什么的&#xff1f; 3. 简单的Socket案例 服务端 客户端 启动&#xff1a; 3.2 在Tomcat发送信息&#xff0c;看…

Linux / Windows | ping IP + Port 测试

注&#xff1a;本文为 “Linux / Windows | ping IP Port 测试端口通畅” 相关文章合辑。 未整理去重。 windows 如何确认服务器上程序端口是否正常&#xff08;ping、tcping&#xff09; 三希已于 2023-05-22 18:08:06 修改 方式 1&#xff1a;ping 命令 ping 命令说明 p…

计算机网络之网络层超详细讲解

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之网络层超详细讲解 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; …

LLMC:大语言模型压缩工具的开发实践

关注&#xff1a;青稞AI&#xff0c;学习最新AI技术 青稞Talk主页&#xff1a;qingkelab.github.io/talks 大模型的进步&#xff0c;正推动我们向通用人工智能迈进&#xff0c;然而庞大的计算和显存需求限制了其广泛应用。模型量化作为一种压缩技术&#xff0c;虽然可以用来加速…

jvm内存优化方式

1. JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a; • 定义&#xff1a;Java虚拟机&#xff0c;是运行Java字节码的抽象计算机。 • 内存管理&#xff1a;负责内存的分配和回收&#xff0c;是JVM内存优化的核心。 2. 堆&#xff08;Heap&#xff09;&#xff1a…

360智脑张向征:共建可信可控AI生态 应对大模型安全挑战

发布 | 大力财经 人工智能的加速发展&#xff0c;有力推动了社会的数智化转型&#xff1b;与此同时&#xff0c;带来的相关安全风险也日益凸显。近日&#xff0c;在北京市举办的通明湖人工智能开发与应用大会上&#xff0c;360智脑总裁张向征以“大模型安全研究与实践”为主题&…

CNCF云原生生态版图-分类指南(三)- 运行时

CNCF云原生生态版图-分类指南&#xff08;三&#xff09;- 运行时 CNCF云原生生态版图-分类指南三、运行时&#xff08;Runtime&#xff09;&#xff08;一&#xff09;云原生存储&#xff08;Cloud Native Storage&#xff09;1. 是什么&#xff1f;2. 解决什么问题&#xff1…

【实验】基于双向LSTM和注意力机制的文本分类

目录 1 数据 2 模型构建 2.1 注意力打分函数 2.1.1 加性模型 2.1.2 点积模型 2.2 注意力分布计算 2.3 加权平均 2.4 完整注意力机制的实现 2.4 模型汇总 3 模型训练 3.1 使用加性注意力模型 3.2 使用点积注意力模型 4 模型评价 4.1 使用加性注意力模型 4.2 使用点…

Tongweb7049M4有关SSL/TLS 服务器瞬时 Diffie-Hellman 公共密钥过弱的处理方案(by lqw)

前提条件&#xff1a;Tongweb7049M4已在http通道里配置了https&#xff08;如何配置https可以参考这个帖子&#xff1a;东方通TongWEB添加Https证书&#xff0c;开启SSL&#xff09; 遇到客户在配置了https后&#xff0c;扫描漏洞提示&#xff1a; 有关SSL/TLS 服务器瞬时 Dif…

浩辰CAD教程004:柱梁板

文章目录 柱梁板标准柱角柱构造柱柱齐墙边绘制梁绘制楼板 柱梁板 标准柱 绘制标准柱&#xff1a; ①&#xff1a;点选插入柱子②&#xff1a;沿着一根轴线布置柱子③&#xff1a;指定的矩形区域内的轴线交点插入柱子 替换现有柱子&#xff1a;选择替换之后的柱子形状&#x…