全局变量和局部变量以及静态修饰作用

news/2024/9/27 23:30:57

1,全局变量和全局静态变量

a、全局变量:全局变量存放在静态存储区,作用域是全局(对比下面添加static),整个声明周期都可以使用,其他文件如需要使用,需要添加extern

b、全局静态变量 (static):分配的内存与全局变量一样,也是在静态存储内存上,其生命周期也是与整个程序同在的,从程序开始到结束一直起作用,
      全局静态变量作用域只在定义它的一个源文件内,其他源文件不能使用它。(也就是其他文件也可以用同样名字的静态变量)

相同点

是由编译器自动分配和释放的,

初始化的全局变量和静态变量放在同一块内存区中

在调用main之前,内存先从FASH copy 数据(全局/静态变量),和复制全0段的(全局/静态变量)

全局变量和静态变量从0x2000,000开始存。

2,局部变量和局部静态变量

局部静态变量分配的内存也是在静态存储内存上的,其第一次初始化后就一直存在直到程序结束(只初始化一次),该变量的特点是其作用域只在定义它的函数内可见,出了该函数就不可见了。
局部 变量      分配内存是分配在栈存储区上的,其作用域也只是在局部函数内,在定义该变量的函数内,只要出了该函数,该局部变量就不再起作用,该变量的生命周期也只是和该函数同在。-----------个人理解:局部变量可以节省内存,另外在函数内运算比全局变量快,但是切换函数需要入出栈。

3,代码举例

volatile int a = 0;  // 全局初始化区  ①存放在内存起始单元0x2000,0000  【在flash也占用空间】
volatile char *p1;   //全局未初始化区 ②存放在起始单元00x2000,0004     【在flash只占用描述空间】
void test(void)
{volatile  int t1=10;      //局部变量              ④存放在栈空间  0x2000,0600  【】volatile static int t2 =0;//局部静态变量          ③存放在起始单元0x2000,0008     //    printf("%d %d  ",t1,t2);//防止代码被优化
}
void main()
{volatile int b  = 0;                              //栈          ⑥存放在栈空间  0x20000620volatile char s[] = "abc";                        //栈          ⑤存放在栈空间  0x2000061C volatile char *p2;                                //栈          存放在堆空间  0x20000618 volatile char *p3 = "123456";          //123456\0在常量区,p3在栈上。 0x20000614  volatile static int c =0;              //局部(静态)初始化区 ④存放在起始单元00x2000,000ctest();//分配得来得10和20字节的区域就在堆区。p1 = (char *)malloc(10);p2 = (char *)malloc(20);volatile char *p4= (char *)malloc(20);  //存放在堆空间 0x20000610strcpy(p2, "123456");                               //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。printf("%d %d %d %d  %d %d  %d ",a,s[0],&p3,c,p1,b,&p2,&p4);  //防止代码被优化
}

总结

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

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

相关文章

在 Kubernetes 上运行 Apache Spark 进行大规模数据处理的实践

在刚刚结束的 Kubernetes Community Day 上海站,亚马逊云科技在云原生分论坛分享的“在 Kunernets 上运行 Apache Spark 进行大规模数据处理实践”引起了现场参与者的关注。开发者告诉我们,为了充分利用 Kubernetes 的高可用设计、弹性,在越来越多的应用场景中,他们选择从 …

C语言实现获取BMP文件信息

C语言实现获取BMP文件信息通过命令行传递文件路径参数,输出BMP的width、height、size 1、从BMP的结构信息可知,文件大小、图片宽度、图片高度均占据4个字节,所以只需要打开文件读取对应位置的信息并打印即可。 2、为了提高可移植性,可以定义结构体,保持和BMP文件结构一致,…

系统IO常用函数接口

本文整理归纳了几种常用的系统IO的函数借口,以供读者查阅使用 目录系统IO与标准IO的区别打开文件:open关闭文件:close文件读取:read文件写入:write位置偏移:lseek 系统IO与标准IO的区别 1.标准IO可以看成是在系统IO的基础上封装了缓冲机制。 2.标准IO在内核中使用链表的管…

关于事件对象中的stopImmediatePropagation

关于e.stopPropagation(),大家应该知道这个方法是用来阻止事件冒泡的。 那么e.stopImmediatePropagation()可能比较少见。 stopImmediatePropagation 用来阻止在同一DOM对象上同一事件类型的其它事件函数的执行 并且与事件先后注册的顺序有关 document.addEventListener("…

【视频】R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险|数据分享|附代码数据

原文链接:http://tecdat.cn/?p=22410 最近我们被客户要求撰写关于逻辑回归的研究报告,包括一些图形和统计输出。 本文介绍了逻辑回归并在R语言中用逻辑回归(Logistic回归)模型分类预测病人冠心病风险数据 逻辑回归是机器学习借用的另一种统计分析方法。当我们的因变量是二…

数据分享|python分类预测职员离职:逻辑回归、梯度提升、随机森林、XGB、CatBoost、LGBM交叉验证可视化

全文链接:https://tecdat.cn/?p=34434 原文出处:拓端数据部落公众号 分析师:Shilin Chen 离职率是企业保留人才能力的体现。分析预测职员是否有离职趋向有利于企业的人才管理,提升组织职员的心理健康,从而更有利于企业未来的发展。 解决方案 任务/目标 采用分类这一方法构…

MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类|附代码数据

原文链接:http://tecdat.cn/?p=26318 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于长短期记忆 (LSTM) 神经网络的研究报告,包括一些图形和统计输出。 此示例说明如何使用长短期记忆 (LSTM) 网络对序列数据的每个时间步长进行分类。 要训​​练深度神经网络对序列…

14.GUI 编程

1.GUI 编程简介 GUI:图形用户界面 GUI 核心技术:Swing、Awt 类界面不美观 需要 jre 环境为什么要学习:可以写出一些小工具 工作时候,也可能需要维护到 Swing 界面,概率绩效 了解 MVC 架构,了解监听2.AWT 类 2.1.Awt 介绍 包含了很多类和接口 元素:窗口、按钮、文本框 ja…