存储类别、链接与内存管理(二)
0、前言概要
本篇来自于我的另外一篇博客存储类别、链接与内存管理(一)的续篇,主要分析了C语言中的不同存储类别、关键字以及使用的注意事项
1、自动变量
(1)属性
自动存储期、块作用域、无连接
(2)关键字[存储类别声明符]:auto
(3)使用例子
int loop(int n){ auto int m;}
(4)关键解析
- auto关键字在C++代码中完全不同,如果写C和C++兼容的语言,最好不要使用auto关键字
- 由于块内使用的变量大都是auto修饰的自动变量,所以在中的程序中auto关键字使用的非常少,除非你想强调这是一个自动变量
- 块作用域和无链接属性意味着只有在变量定义的块中才能“直接”使用变量名来访问该变量(当然排除通过指针的情况,这种属于间接)
- 变量具有自动存储期意味着,程序在进入该变量声明的所在块时存在,退出程序的时候变量消失
- 当变量消失的时候,该变量原来占有的内存位置现在可做他用
- 自动变量不会自己初始化,除非显示初始化它。另外可以用非常量表达式初始化自动变量,前提是所用的变量之前有定义过
int main(void)
{int ruth = 1;//显式初始化int rance = 5 * ruth;//使用了之前初始化过的变量
}
2、寄存器变量
(1)属性
自动存储期、块作用域、无链接
(2)关键字[存储类别声明符]:register
(3)使用例子
int main()
{register int quick;
}
(4)关键解析
- 寄存器变量存储在CPU的寄存器中,寄存器的数据传递速度是极快的,但是通常寄存器的空间不会太大
- 与普通变量相比,访问和处理寄存器变量的速度更快
- 由于寄存器变量存储在寄存器而非内存当中,所以无法获取寄存器变量的地址(这一点可以用&检验一下)
- 该关键字更像是请求而不是直接命令,编译器必须根据寄存器或最快可用的内存的数量衡量你的要求(或是忽略你的要求,这种情况下寄存器变量就会转化为自动变量)。即使是这样,也依旧不能对被修饰了register的变量取地址
- 可声明为register的数据类型有限,例如处理器中的寄存器可能就没有足够大的空间来存储double类型的值
3、静态外部链接变量
(1)属性
静态存储期、文件作用域、外部链接
(2)关键字[存储类别说明书]:extern
(3)使用例子
//第一个.c文件内容
int a = 100;
//第二个.c文件内容
#include <stdio.h>
int main()
{extern a;printf("%d", a);return 0;
}
(4)关键解析
- 把一个变量的定义放在所有函数(包括mian)的外面,那么该变量就是外部变量
- 把变量的定义性声明放在所有函数的外面边创建了外部变量,此时如果为了强调函数使用了外部变量可以在函数内部使用关键字extern再次声明;但是如果是在别的.c文件里声明的外部变量,就必须使用extern再次声明
//第一个.c文件
char Coal = 100;
char arr[10] = { 'a', 'b', 'c' };
//第二个.c文件
int Errupt;//在本文件的外部变量
double Up[100];//在本文件的外部变量数组extern char Coal;//在其他文件的外部变量
extern char arr[];//在其他文件的外部变量数组int main()
{extern int Errupt;//可写可不写extern double Up[];//可写可不写//使用Errupt和Up的代码//使用Coal和arr的代码return 0;
}
- 在外部变量数组中,可以看到不需要指明数组的大小,因为第一次已经提供了数组大小的信息
- 由于外部变量本身具有文件作用域所以在main里面的extern整条语句完全可以省略,但是如果只是省略extern(比如剩下int Errupt)就会重新定义一个名未Errupt的自动变量,这个自动变量Errupt和外部变量Errupt是不同的
- 静态外部变量可以被显示初始化,也可以不显示初始化(默认初始化未0,数组也一样),但是只能使用常量表达式进行初始化
int i = 10;//没问题
int j = 3 + 20;//没问题
int x = sizeof(int);//没问题,只要不是变长数组sizeof可以视为常量表达式
int y = 10 * i;//不允许
int main()
{//某些代码
}
- extern关键字只是一种引用式声明,不是定义式声明,因此不要用关键字extern创建一个外部变量的定义,它只能用来引用现有的外部变量定义
- 外部变量只能初始化一次,并且必须在定义该变量时进行
//第一个.c文件
int a = 100;
//第二个.c文件
int main()
{extern int a = 200;//这是不被允许的!因为在另外一个文件里已经初始化为100了a = 200;//但是如果上面只写extern int a;使用赋值就可以,赋值不是初始化
}
4、静态内部链接变量
(1)属性
静态存储期、文件作用域、内部链接
(2)关键字[存储类别关键字]:static
(3)使用例子
static int svil = 1;int main(){ //某些代码
(4)关键解析
- 在内部链接的静态变量只能在本文件内部使用
- 另外也可以使用extern在函数的内部声明存在这个外部变量(注意不会改变链接属性!)
int a = 1;//具有外部链接属性
static int b = 2;//具有内部链接属性
int main()
{printf("%d %d\n", a, b);{extern int a;//提醒a是外部变量,但是依旧是外部连接属性extern int b;//提醒外部变量,但是依旧是内部连接属性printf("%d %d", a, b);}return 0;
}
5、静态无链接变量
(1)属性
静态存储期、块作用域、无链接
(2)关键字[存储类别说明书]:static
(3)使用例子
#include <stdio.h>
void trystat(void)
{int fade = 1;static int stay = 1;printf("fade = %d and stay = %d\n", fade++, stay++);
}
int main()
{int count;static int number;for (count = 1; count <= 3; count++){printf("Here comes iteration %d:\n", count);trystat(); }printf("%d\n", number);return 0;
}
(4)关键解析
- 静态的意思是该变量在内存中原地不动(计算机会记录它的值),并不是说它的值不变,它不像自动变量一样在一定范围使用完后就被销毁
- 每次调用函数trystat后fade会被重新初始化为1,stay只在只会在编译trystat函数时被初始化一次
- 第一条声明fade确实是trystat函数的一部分,每次调用该函数都会执行这条声明;第二条声明stay实际上不是trystat函数的一部分,如果逐语句调试就会发现这条指令貌似被跳过了?这是因为静态变量和外部变量在程序被载入的时候就已经执行完毕。第二条声明语句放进函数中是为了告诉编译器只有在trystat函数才能看到该变量
- 如果未显式初始化静态变量,就会被自动初始化为0。例如本例中的number在打印的时候并未报错,甚至还自动给了number一个0的值
6、参考来源
来自书籍《C primer puls》第12章的“存储类别、链接和内存管理”章节
相关文章:
存储类别、链接与内存管理(二)
0、前言概要 本篇来自于我的另外一篇博客存储类别、链接与内存管理(一)的续篇,主要分析了C语言中的不同存储类别、关键字以及使用的注意事项 1、自动变量 (1)属性 自动存储期、块作用域、无连接 (2&a…...
JavaScript 入门教程||javascript 简介||JavaScript 用法
javascript 简介JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。JavaScript 是脚本语言JavaScript 是一种轻量级的编程语言。JavaScript 是可插入 HTML 页面的编程代…...
新闻稿写作指南
当你想要传达一则新闻,写一份新闻稿是非常必要的。新闻稿的目的是让读者了解某个事件或信息,以及提供与之相关的背景信息和重要细节。以下是新闻稿的写作指南,帮助你写出一份清晰、简洁、有价值的新闻稿。1、选择一个有新闻价值的主题你的新闻…...
一文详解Redis持久化的两种方案
一文详解Redis持久化的两种方案1.RDB持久化2.RDB持久化原理3.AOF持久化4.RDB VS AOF1.RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,…...
第六章 - 数据过滤where(where与and和or的组合用法)
第六章 - 数据过滤(where的用法)基本用法where的条件限制符等于号不等号! 或者<>小于<大于>小于等于<大于等于>between 的用法空值和非空值组合条件 and组合条件 orand 和 or 的计算次序in 和 not in基本用法 在查询语句中࿰…...
Oracle 定时任务例子
背景: 创建一个Oracle的定时任务,每天或指定时间 -----定义存储过程 create or replace procedure AAA_BBB as begin insert into AAA select * from BBB; commit; end; ----------------创建定时任务 declare xjobid number; begin DBMS_JOB.SUBM…...
Android常用9种自动化测试框架对比,Appium有哪些优势?
随着移动终端的普及,手机应用越来越多,也越来越重要。 App的回归测试用例数量也越来越多,全量回归也越来越消耗时间。移动 APP自动化测试 的难点移动 APP的UI自动化测试长久以来一直是一个难点,难点在于UI的”变”, 变化导致自动化…...
在vue2使用百度脑图的kityminder-core进行二次开发思维导图,给节点绑定数据后添加新的图标
需求说明:在给某个节点绑定文件数据后,用户并不能一眼看出哪个节点上绑定了数据,因此需要在绑定文件数据后给节点上加一个图标用于标识。 添加图标 1、在kityminder-core/src/module/file.js文件中添加代码 (file.js文件如何添加…...
FPGA时序约束与分析 --- 时序约束概述
本系列参考文献 — FPGA时序与约束分析-吴厚航 FPGA从综合到实现需要的过程如下:synth_design -> opt_design -> place-design -> phys_opt_design -> route_design 1、时序约束的理解 2、时序约束的基本路径 3、时序约束的步骤 4、时序约束的主要方法…...
2022——寒假总结
文章目录背景报名摸索结果总结背景 大一上学期,刚上大学没有尽快适应,什么都没有学到。 因为疫情,所以平时的测试以及期末都是线上进行的,就没怎么认真学,网课直接划水。 我的生活与学习很不平衡,还热衷于参…...
C++11 Lambda表达式
文章首发公众号:iDoitnow 为什么引入Lambda Lambda表达式是一个可以内联在我们代码中的函数,我们可以将他传递给另外一个函数。在没有引入Lambda表达式之前,当我们遇到需要对多个数据,按照同一规则进行操作的时候,创建…...
冰湖灾害遥感监测评价与模拟分析
查看原文>>>mp.weixin.qq.com/s?__bizMzAxNzcxMzc5MQ&mid2247582638&idx1&sna22a1697b16a5edc2b74cb1ccf011689&chksm9be29cbeac9515a8227460103ae1b9f280af688eab0ce5a43448f9fa7c9cab820c389fcdc031&token10630879&langzh_CN#rd【专家简介…...
Highcharts.Chart
Highcharts 是一个使用javascript 脚本来生成图表的工具,和jfreechart 作用类似,都用来生成各种图表,并支持图片的导出和打印。 从官网 www.highcharts.com 上下载的压缩表中的example中有各种图表的例子。 要编写生成图表的例子建议从 文…...
遍历map的几种方法
#先往map加入几个数据 Map<Integer,String> mapnew HashMap<>(); map.put(1,"美好的周一"); map.put(2,"美好的周二"); map.put(3,"美好的周三"); 1 2 3 4 方法一:普通的foreach循环,…...
RocketMQ源码分析之Broker概述与同步消息发送原理与高可用设计及思考
1、Broker概述 Broker 在 RocketMQ 架构中的角色,就是存储消息,核心任务就是持久化消息,生产者发送消息给 Broker,消费者从 Broker 消费消息,其物理部署架构图如下: 备注:以上摘录自官方 RocketMQ 设计文档…...
K8s常见面试题总结
部分内容来自:k8s面试题大全(持续更新中) 目录 k8s常考面试题 1.1.什么是k8s? 1.2.简述Docker和Kubernetes的关系 1.3.k8s的组件有哪些,作用分别是什么? 1.4.简述kubelet的功能和作用 1.5.简述pod是…...
OpenFeign 自定义解码器Decoder 失效
问题描述 项目上开发了OpenFeign的自定义解码器,用来统一处理返回结果。 开发完后测试已经生效了,过两天后,这块代码没有变动的情况下,发现请求结果突然又不走自定义的解码器了。 代码如下 解码器 BaseResponseFeignDecoder …...
c++练习题8
1.在do-while循环中,循环由do开始,用while结束;必须注意的是:在while表达式后面的 不能丢,它表示do-while语句的结束。 A)0 B)1 C);…...
Python循环语句代码详解:while、for、break
目录 1 while循环 1 while循环 循环语句是程序设计中常用的语句之一。任何编程语言都有while循环,Python也不例外。while循环的格式如下所示。 while(表达式): … else: … while循环的执行过程:当循环表达式为真时,依次执行whi…...
vue父子组件传值不能实时更新
最近做项目,遇到个大坑,这会爬出来了,写个总结,避免下次掉坑。 vue父子组件传值不能实时更新问题,父组件将值传给了子组件,但子组件显示的值还是原来的初始值,并没有实时更新,为什么…...
2023美赛A题思路数据代码分享
文章目录赛题思路2023年美国大学生数学建模竞赛选题&论文一、关于选题二、关于论文格式三、关于论文提交四、论文提交流程注意不要手滑美赛A题思路数据代码【最新】赛题思路 (赛题出来以后第一时间在CSDN分享) 最新进度在文章最下方卡片,加入获取一手资源 202…...
【蓝桥杯集训·每日一题】AcWing 3768. 字符串删减
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴双指针一、题目 1、原题链接 3768. 字符串删减 2、题目描述 给定一个由 n 个小写字母构成的字符串。 现在,需要删掉其中的一些字母,使得字符串中不…...
Python|每日一练|树|深度优先搜索|数组|二分查找|链表|双指针|单选记录:填充每个节点的下一个右侧节点指针|搜索插入位置|旋转链表
1、填充每个节点的下一个右侧节点指针(树,深度优先搜索) 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node { int val; Node *left; Node *rig…...
降雨量实时监测系统压电式雨量计
压电式雨量传感器由上盖、外壳和下盖组成,壳体内部有压电片和电路板,可以固定在外径50mm立柱上和气象站横杆上。传感器采用冲击测量原理对单个雨滴重量进行测算,进而计算降雨量。雨滴在降落过程中受到雨滴重量和空气阻力的作用,到…...
滑动相关的原理以及用滤波器实现滑动相关(匹配滤波器捕获DMF)
目录滑动相关匹配滤波器捕获(DMF)滑动相关 滑动相关属于一种时域捕获方法,其具体原理是是通过本地序列与接收信号在固定窗长内滑动累加得到相关结果。 一般滑动相关算法可以用于对自相关性非常好的伪码进行同步判决。 我们首先生成一组自相关…...
计算机网络笔记(三)—— 数据链路层
数据链路层概述 数据链路层以帧为单位传输数据。 封装成帧:给网络层提供的协议数据单元添加帧头帧尾 差错检测:检错码封装在帧尾 可靠传输:尽管误码不能避免,但如果可以实现发送什么就接受什么,就叫可靠传输 封装成…...
【日常】矩阵正态分布参数检验问题
最近给凯爹做的一个苦力活,统计检验这个东西说实话也挺有趣,跟算法设计一样,好的检验真的是挺难设计的,就有近似算法的那种感觉,检验很难保证size和power都很理想,所以就要做tradeoff,感觉这个假…...
QML矩形(Rectangle)
Rectangle 用于绘制矩形 常见的属性: 填充颜色:纯色:color 渐变 :Gradient类 渐变的优先级大于纯色Gradient(渐变色): 渐变由多种颜色定义,这些颜色将无缝混合,…...
CSS自定义鼠标样式
CSS自定义鼠标样式 属性值 属性描述url需使用的自定义光标的 URLdefault默认光标(通常是一个箭头)auto默认。浏览器设置的光标crosshair光标呈现为十字线pointer光标呈现为指示链接的指针(一只手)move此光标指示某对象可被移动e…...
春招Leetcode刷题日记-D4-双指针算法-滑动窗口快慢指针
D4-双指针算法-滑动窗口&&快慢指针快慢指针算力扣141. 环形链表思路代码力扣142. 环形链表 II思路代码滑动窗口力扣76. 最小覆盖子串思路代码力扣424. 替换后的最长重复字符思路代码快慢指针算 快慢指针算法,多用于链表当中,常见的如࿱…...
网站开发支持环境/seo快速入门教程
一、简介与原理 http协议是明文传输的,因此很容易被截取和解析,泄漏个人数据。https协议是在http和tcp之间多添加了一层,进行身份验证和数据加密。 HTTPS 原理 ① 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器 ②…...
重庆市建设监理协会网站/网络优化网站
在Java的泛型出现之前,只有数组可以用来存储指定类型的对象;在自动装箱机制出现之前,只有数组可以用来存储基本数据类型;也就是说,在泛型和自动装箱机制出现之前,数组在Java当中的分量举足轻重。 况且数组还…...
长沙营销企业网站建设/北京建站
什么是软膜灯箱?软膜灯箱属于超薄灯箱的一种,我们把他分为这几类:光面软膜灯箱,缎光面软膜灯箱,透光面软膜灯箱,基本膜软膜灯箱,绒面软膜灯箱,金属面软膜灯箱和冲孔面软膜灯箱。随着灯箱技术这…...
网站开发项目周报/西安建站推广
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 需要实现的功能:采用udp下的socket编程,当按下确认键,模拟器发送文本框数据,pc机上的网络调试助手接收 环境:win7 eclipse sdk 代码: p…...
安徽奶茶加盟网站建设/谷歌竞价排名推广公司
一、写文件 #include <fstream> ofstream ofs;//创建流对象 ofs.open(path,打开方式);//指定路径和打开方式 //打开方式: // ios::in 读文件打开 // ios::out 写文件打开 // ios::ate 从文件尾打开 // ios::app 追加方式打开 // ios::trunc 如已有…...
上海网站推广优化公司/有哪些免费网站可以发布广告
九章算法官网-原文网址 http://www.jiuzhang.com/problem/74/题目 给一个链表,然后我们要把这个链表中第m个节点到第n个节点的部分翻转。在线测试本题 http://www.lintcode.com/en/problem/reverse-linked-list-ii/解答 为更好处理表头和第m个节点,引入…...