C语言之变量的存储方式和生存周期

一、变量的存储方式

C语言变量的存储有两种方式:静态存储方式和动态存储方式,相应的生产期也有两种:静态生存期和自动生存期。

①静态存储方式:在程序运行前为变量内存分配内存,在程序结束后回收变量的内存。(静态生存期)

②动态存储方式:在程序运行过程中,根据需要动态地分配或回收内存,与静态存储方式相比,动态存储方式,具有更好的存储效率。(自动生存期)

注意:

1.所有的全局变量都是静态存储方式

2.局部变量要根据存储类型来区分具体的存储方式。

二、局部变量的三种储存类型

三种储存类型:自动变量、静态局部变量、寄存器变量

①自动变量

自动变量的定义方式:

auto <数据类型> <变量名>

如:

auto int a;

当然,auto也可以省略不写,因为但凡没有声明储存类型的局部变量,一律默认为自动变量。

自动变量的分配和回收

只有在局部变量的作用域,自动变量才能被引用。

在程序进入作用域,编译系统自动为其提供内存;在离开作用域后,回收其内存。

例1:比较两数大小的函数:

#include <stdio.h>

int max(int x,int y)     //主函数调用该函数进行传参时,为x,y分配内存
{                  
	int z;               //执行至此,为z分配内存
	if(x > y)
		z = x;
	else
		z = y;
	return z;            //执行至此,回收x,y,z的内存

}
int main()
{
	int a, b, c;         //执行至此,为a,b,c分配内存
	scanf("%d%d", &a, &b);
	c = max(a,b);        
	printf("max=%d\n",c);//执行至此,回收a,b,c的内存
	return 0;
}

例2,

#include <stdio.h>

int fac(int n)
{
	int f = 10;
	f = f * n;
	return (f);
}
int main()
{
    int fac(int n);
	int s;
	s = fac(2);
	printf("第一次调用的s:%d\n",s);
	s = fac(3);
	printf("第二次调用的s:%d\n",s);
	return 0;
}

运行结果:

 程序分析:

1、由于f定义为自动变量,程序进入函数是为f分配内存,函数返回时回收内存

2、第一调用fac函数fac返回时f的内存被回收,第二次调用fac函数,又重新给f分配内存,所以两次的f是相互独立的变量。

②静态局部变量(static 局部变量)

定义形式:static  <数据类型> <变量名>,如:

static int b;

如果不初始化,默认变量值为0;

如果要将上述程序的变量f定义为静态变量:

#include <stdio.h>

int fac(int n)
{
	static int f = 10;
	f = f * n;
	return (f);
}
int main()
{
    int fac(int n);
	int s;
	s = fac(2);
	printf("第一次调用的s:%d\n",s);
	s = fac(3);
	printf("第二次调用的s:%d\n",s);
	return 0;
}

运行结果:

程序分析:

1、由于f是静态变量,因此在程序执行前就为f分配内存,在运行过程中不会再次初始化,直到程序结束才回收内存。

2、因此,两次被调用的f是同意变量,第一次调用的f的值会继续保留给第二次调用。

例3、输出1到5的阶乘值 

#include <stdio.h>
int fac(int n)
{
	static int f = 1;
	f = f * n;
	return f;
}
int main()
{
	int i;
	for(i = 1;i <= 5;i ++)
	{
		printf("%d!=%d\n", i, fac(i));
	}
	return 0;
}

 

运行结果:

③寄存器变量

寄存器变量是存储在CPU寄存器的自动变量,便于快速访问。

寄存器变量的定义方式:register 数据类型 变量名

注意:由于寄存器变量存储在CPU的寄存器中,不存储在内存单元中,无法进行取地址运算

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

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

相关文章

java-sec-code中重定向

重定向 状态码3xx 存在问题的代码段 GetMapping("/redirect") public String redirect(RequestParam("url") String url) {return "redirect:" url; }用户访问/redirect路径时&#xff0c;redirect方法会获取web请求中的url参数内容&#xff0…

文化传媒企业网站建设的效果如何

文化传媒业可以细分为多个类目&#xff0c;如企业营销宣传、明星包装、主播打造、马戏团、动漫等&#xff0c;这些都有很高的市场需求度&#xff0c;尤其近些年互联网深入各个行业&#xff0c;线上发展尤为重要&#xff0c;也促进了文化传媒业的发展。 同时该行业需求者&#…

React脚手架搭建

React脚手架 脚手架&#xff1a;可以快速构建项目的基本架构。 脚手架安装命令 可全局安装脚手架 创建项目 来到当前目录下 create-react-app 项目名&#xff08;不要大写字母&#xff09; 运行项目 进到项目里&#xff0c;在项目目录下&#xff0c;执行 npm start &#xff…

FC-13A(用于汽车应用的kHz范围晶体单元,低轮廓贴片)

FC-13A晶体非常适合用在汽车导航系统设计中的应用&#xff0c;是一种具有优异的频率性能和AEC-Q200标准认证的汽车工业级高精度晶体,FC-13A是一款尺寸为3.2 1.5 0.9mm&#xff0c;频率范围32.768KHz耐高温晶振&#xff0c;频率温度系数仅为-0.04ppm/℃&#xff0c;并且其老化…

总结一些vue3小知识2

1.el-tree-select和el-tree组件报错&#xff08;有的下拉选项选择不了&#xff0c;一点击就报错&#xff0c;但是有的却能选择&#xff0c;不会报错&#xff09; 原因:就如同v-for一样&#xff0c;需要添加key才不会出现渲染错误&#xff0c;而el-tree-select和el-tree组件需要…

Python数据科学视频讲解:Python集合

2.14 Python集合 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.14节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据科学应用…

基于YOLOv8深度学习的西红柿成熟度检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【后端学前端】第四天 css动画 垂直轮播效果(css变量、位移缩放动画、动画延迟)

1、学习信息 视频地址&#xff1a;css动画 垂直轮播效果&#xff08;css变量、位移缩放动画、动画延迟&#xff09;_哔哩哔哩_bilibili 2、源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title…

Java基础语法之抽象类和接口

抽象类 什么是抽象类 并不是所有的类都是用来描述对象的&#xff0c;这样的类就是抽象类 例如&#xff0c;矩形&#xff0c;三角形都是图形&#xff0c;但图形类无法去描述具体图形&#xff0c;所以它的draw方法无法具体实现&#xff0c;这个方法就可以没设计成抽象方法&…

【漏洞复现】Node.js 目录穿越漏洞(CVE-2017-14849)

文章目录 1.1、漏洞描述1.2、影响版本1.3、漏洞复现1、基础环境2、漏洞验证3、漏洞分析 1.4、参考 1.1、漏洞描述 原因是 Node.js 8.5.0 对目录进行normalize操作时出现了逻辑错误&#xff0c;导致向上层跳跃的时候&#xff08;如../../../../../../etc/passwd&#xff09;&am…

闲人闲谈PS之四十九——PLM和SAP集成常见的问题

惯例闲话&#xff1a;天气突变&#xff0c;没想到珠三角也骤降了10几度&#xff0c;昨晚还吹风扇模式&#xff0c;早上起来一下子感觉丝丝凉意。闲人还是喜欢冬天&#xff0c;冷&#xff0c;能让人思维清晰&#xff0c;提高工作效率。趁着天气适宜&#xff0c;赶紧加班擦屁股去…

关于pycharm无法进入base界面的问题

问题&#xff1a;terminal输入activate无法进入base 解决方案 1.Cortana这边找到Anaconda Prompt右击进入文件所在位置 2. 右击进入属性 3. 复制cmd.exe开始到最后的路径 cmd.exe "/K" C:\ProgramData\anaconda3\Scripts\activate.bat C:\ProgramData\anaconda3 …

Python语言学习笔记之八(文件IO)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 1、什么是文件I/O 在Python中&#xff0c;文件IO&#xff08;输人/输出)是指与文件进行交互的过程。这包括读…

JMESPath语言

JMESPath&#xff08;JSON Matching Expression Path&#xff09; 一种查询语言。 主要用于从JSON文档中检索和过滤数据。 通过写表达式提取和处理JSON数据&#xff0c;而无需编写复杂的代码。 功能&#xff1a;数据提取、过滤、转换、排序。 场景&#xff1a;处理API响应…

【谭浩强C程序设计精讲 1】数据类型、常量与变量

文章目录 3.1 C 的数据类型3.2 常量与变量3.2.1 常量和符号常量3.2.2 变量 3.1 C 的数据类型 C语言的数据结构是以数据类型形式出现的。C的数据类型如下&#xff1a; C语言中数据有常量与变量之分&#xff0c;它们分别属于以上这些类型。由以上这些数据类型还可以构成更复杂…

三分钟搞定 || java邮件发送(支持附件,多发)

1.添加Maven依赖 <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version> </dependency><dependency><groupId>cn.hutool</groupId><artifactId>…

图书管理系统jsp + servlet+mysql

图书管理系统 项目使用jsp servletmysql实现&#xff1b; 登陆注册 首页 首页显示图书信息 图书管理 1添加书籍 2查询书籍 3预览书籍 4修改书籍 用户管理 1查询用户 2修改用户 3 删除用户 链接&#xff1a;https://pan.baidu.com/s/1QXK--ypb6OadbmKFlc0jUQ

跨域的解决方式(java后端)

文章目录 一、跨域介绍1、什么是跨域2、为什么会产生跨域3、禁止跨域的原因 二、简单请求和非简单请求1、简单请求1.1、什么时简单请求1.2、简单请求基础流程 2、非简单请求2.1、预检请求2.2、预检请求的回应2.3、浏览器的正常请求和回应 3、自定义跨域过滤器 三、解决方式1、C…

2023年【G2电站锅炉司炉】考试题库及G2电站锅炉司炉考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G2电站锅炉司炉考试题库参考答案及G2电站锅炉司炉考试试题解析是安全生产模拟考试一点通题库老师及G2电站锅炉司炉操作证已考过的学员汇总&#xff0c;相对有效帮助G2电站锅炉司炉考试报名学员顺利通过考试。 1、【多…

【Java】智慧工地系统:让建筑行业管理更简单

概述 智慧工地管理平台面向房建、能源、交通各类工地的管理者&#xff0c;通过AI视频、物联感知技术对工地场景中的施工机械、建筑材料、施工规范、施工环境监管、完善施工现场项目管控。实现项目管控、特种设备管理、绿色施工、工地巡检等业务功能&#xff0c;沉淀工地监管数…