数组存储与指针学习笔记(二)枚举类型、常量与变量

news2024/10/6 22:22:30

嵌入式C语言学习进阶系列文章

GUN C编译器拓展语法学习笔记(一)GNU C特殊语法部分详解
GUN C编译器拓展语法学习笔记(二)属性声明
GUN C编译器拓展语法学习笔记(三)内联函数、内建函数与可变参数宏
数组存储与指针学习笔记(一)数据类型与存储、数据对齐、数据移植、typedef


文章目录

  • 嵌入式C语言学习进阶系列文章
    • 一、枚举类型
      • 1.2 枚举的三种方法与本质
      • 1.3 枚举的三种方法与本质![在这里插入图片描述](https://img-blog.csdnimg.cn/c43c9101723a4b91a048690afb507df8.png#pic_center)
    • 二、常量和变量
      • 1.1 变量本质
      • 1.2 常量存储
      • 1.2 常量折叠


一、枚举类型

  枚举(enum)是C语言的一种特殊类型。当我们在程序中想定义一组固定长度或范围的数值时,可以考虑使用枚举类型。使用枚举可以让程序可读性更强,看起来更加直观。
在这里插入图片描述
  使用enum定义的枚举常量值列表中,默认从0开始,然后依次递增:SUN=0,MON=1,TUE=2,……当然我们也可以显式指定枚举值。

1.2 枚举的三种方法与本质

  使用枚举类型定义变量,使用方法与结构体、共用体类似,经常使用的三种方法如下。
在这里插入图片描述
  枚举是一种类型,属于整型类型。使用enum定义的枚举值列表,其实就是从0开始的一组整数序列。我们使用枚举类型定义的变量,同样可以作为函数参数和函数返回值,可以用来定义数组,甚至和结构体混用等。枚举有点类似typedef,为一个数值添加一个别名,让程序更加直观,可读性更高。
在这里插入图片描述
在这里插入图片描述
  枚举变量和整型变量相互赋值,都是可以正常编译和运行的。我们在代码中使用的枚举类型的变量,在最终编译生成的可执行文件中都会被整型数值代替。
  枚举与预处理指令#define的作用差不多,都是为了增加代码的可读性。宏在预处理阶段,通过简单的字符串替换就全部被替换掉了,编译器根本不知道有宏,而枚举类型则在编译阶段全部被替换为整型。枚举的优势是:枚举可以自动赋值,而宏则需要一个一个单独定义。

1.3 枚举的三种方法与本质在这里插入图片描述

  Linux内核中使用enum定义的枚举类型大部分是没有枚举名的,而且通常会在一串枚举值之后带上一个前缀为NR_的元素来表示枚举值的数量。当我们不需要使用枚举类型去定义一个枚举变量时,枚举并不需要一个名字,这些无名的枚举类型其实就相当于宏定义。而最后一个元素NR或MAX,一般用来记载枚举列表中元素的个数,或者作为循环判断的边界值。

二、常量和变量

  本章节研究的内容是常量和变量在内存中是如何存储的?如何访问它们?

1.1 变量本质

  变量名的本质,其实就是一段内存空间的别名。编译器在编译程序时会将变量名看成一个符号,符号值即变量的地址,各种不同的符号保存在符号表中。我们可以通过变量名对和它绑定的内存单元进行读写,而不是直接使用内存地址。通过变量名访问内存,既方便了程序的编写,也大大增强了程序的可读性。
在这里插入图片描述
  赋值修改:在C语言中,一块可以存储数据的内存区域,一般被称为对象,而操作这片内存的表达式,即引用对象的表达式,我们称之为左值。常见的左值有变量、e[n]、e.name、p->name、*e等这些常见的表达式。但是如数组名、函数、枚举常量、函数调用等都不能作为左值,也不能通过它们去修改对象。
在这里插入图片描述
  一个变量作为左值时,通常表示对象的地址,我们对变量名的引用其实就是对该地址区域进行各种操作。一个变量名作为右值时,通常表示对象的内容。
在这里插入图片描述
  不同类型的变量有不同的存储方式、作用域和生命周期。在定义一个变量时,我们可以使用char、int、float、double等关键字来指定变量的类型,再加上short和long这两个整型限定符,基本上就确定了这个变量在内存中的存储空间的大小。有时候我们还可以使用一些变量修饰限定符来改变变量的存储方式,常用的修饰符有auto、register、static、extern、const、volatile、restrict、typedef等。这些修饰限定符往往会决定变量的存储位置、作用域或生命周期,所以一般也被称为存储类关键字。一个变量如果使用register修饰,意在告诉编译器这个变量将会被频繁地使用,如果有可能,可以将这个变量存储在CPU的寄存器中,以提高其读写效率。
  我们在程序中,定义变量的目的,就是方便对存储在内存中的数据进行读写,不是直接通过地址,而是通过变量名来访问内存。编译器根据我们定义的变量类型,会在内存中分配合适大小的存储空间和地址对齐。变量名的本质,其实就是一段内存存储空间的别名,通过变量名可以直接对这段内存进行读写。

1.2 常量存储

  常量和常量表达式,编译器在编译程序时会把它们单独放在一个叫作.rodata的只读数据段中,我们可以使用objdump命令查看它们。
在这里插入图片描述在这里插入图片描述
  在C语言中,我们常常使用const关键字来修饰一个变量,表示该变量是只读的,不能被修改。如果我们使用const关键字修饰一个数组,则表示该数组中所有元素的值都不能被修改。变量i和j使用const修饰后,存储到了.rodata只读数据段中

1.2 常量折叠

  当一个C语言程序中存在常量表达式时,编译器在编译时会把常量表达式优化成一个固定的常量值,以节省存储空间。我们把这种编译优化称为常量折叠。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

程序的编译过程中,编译器会直接把表达式23+54优化成一个常量26,作为全局变量val的初值存储在数据段中。在内存地址0x21024处,我们可以看到定义的全局变量val的值为0x1a。常量表达式23+54经过编译优化后,表达值的值就变成了26,直接存储在地址为0x21024的内存单元中。

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

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

相关文章

听劝 千万不要盲目自学网络安全

听劝 不要什么盲目的学网络安全。 一,怎么入门? 1、Web 安全相关概念(2 周) 了解网络安全相关法律法规 熟悉基本概念(SQL 注入、上传、XSS、CSRF、一句话木马等)。 通过关键字(SQL 注入、…

人工智能简历-计算机视觉简历

前言 很多粉丝私我,说面试的事情。 这玩意我不理解,因为如果是计算机科班出身,计算机行业我觉得闭着眼睛找。 简历这玩意我真不会。。。 分享2个东西给大家。 第一个是 出国/在国外找实习/外企的英文简历。 比较流行的是一页。 第二个…

高速动车组全谱系图解

很多人认为中国高速铁路起源于2004年以来的技术引进,却不知道中国第一条高铁是1999年开工、2003年建成的秦沈客专;动车组的研制则更早,“蓝箭”、“中原之星”、“中华之星”都是鼎鼎大名。毫无疑问,2004年以来的引进技术&#xf…

SPI配置

I/O配置 主输出、从输入(MOSI) 主出从入(MOSI )引脚是主器件的输出和从器件的输入,用于主器件到从器件的串行数据传输。当SPI 配置为主器件时,该引脚为输出,当 SPI 配置为从器件时,该…

【原创】免费,不限量,使用OpenAI ChatGPT方法大揭秘

文章目录 微软的Edge浏览器集成WeTab插件就可以免费使用ChatGPT1、安装最新版的Edge浏览器2、选中浏览器的配置中的扩展3、在启动新页时,就可以看到chatGPT了4、这就可以免费使用chatGPT啦 微软的Edge浏览器集成WeTab插件就可以免费使用ChatGPT 1、安装最新版的Edg…

零信任网络安全

什么是零信任 零信任是一种安全思维方式,表示组织不应自动信任其边界内外的任何内容。在授予访问权限之前,必须验证任何尝试连接的实体。零信任安全策略围绕最低特权访问控制和严格的用户身份验证,因为假设不信任任何人。 若要实现这些原则…

4年外包终于上岸,我只能说别去....

我大学学的是计算机专业,毕业的时候,对于找工作比较迷茫,也不知道当时怎么想的,一头就扎进了一家外包公司,一干就是4年。现在终于跳槽到了互联网公司了,我想说的是,但凡有点机会,千万…

你不知道的自动化?使用自动化测试在项目中创造高业务价值...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 脱离数据支撑谈价…

WPF中嵌入web网页控件 WebBrowser

1 WebBrowser特点 <font colorblue>WebBrowser控件内部使用IE的引擎&#xff0c;因此使用WebBrowser我们必须安装IE浏览器。 WebBrowser使用的是IE内核&#xff0c;许多H5新特性都不支持&#xff0c;然后使用谷歌内核和火狐内核会使软件的体积增加至几十MB。 <font c…

《MySQL 必知必会》课程笔记(二)

这么多字段类型&#xff0c;该怎么定义&#xff1f; MySQL 中有很多字段类型&#xff0c;比如整数、文本、浮点数等。如果类型定义合理&#xff0c;就能节省存储空间&#xff0c;提升数据查询和处理的速度。相反&#xff0c;如果数据类型定义不合理&#xff0c;就有可能会导致…

详细版易学版TypeScript - 元组和枚举详解

一、元组(Tuple) 数组:合并了相同类型的对象 const myArr: Array<number> [1, 2, 3]; 元组(Tuple):合并了不同类型的对象 // 定义元组时就要确定好数据的类型&#xff0c;并一一对应 const tuple: [number, string] [12, "hi"]; // 添加内容时&#xff0c;不…

【Shiro】SimpleAuthorizationInfo如何授权

一、前言 本文基于上一篇文章进行介绍【Shiro】SimpleAuthenticationInfo如何验证password。 二、自定义的ShiroRealm类 经过上一篇文章的探求&#xff0c;这回直接找准doGetAuthorizationInfo方法&#xff1b;我们回过头看下ShiroRealm&#xff0c;它继承了AuthorizingRealm…

Hbase入门篇01---基本概念和部署教程

Hbase入门篇01---基本概念和部署教程 HBase基本概念HadoopHadoop的局限 HBase 与 NoSQLHBase应用场景发展历程HBase特点 RDBMS与HBase的对比关系型数据库HBaseHDFS对比HBaseHive对比Hbase总结Hive与HBase HBase集群搭建HBASE_MANAGES_ZK属性的作用安装报错&#xff0c;解决思路…

面试被问到了解哪些开发模型?看这一篇就够了

前言 软件开发模型是指软件开发全部过程、活动和任务的结构框架。一般包括需求、设计、编码和测试等阶段&#xff0c;甚至包括维护阶段。软件开发模型明确规定了软件开发过程中要完成的主要活动和任务&#xff0c;用来指导整个开发过程中的工作。对于不同的系统&#xff0c;可…

SSD系列2——PriorBox

SSD系列&#xff1a; SSD系列1——网络结构 SSD系列2——PriorBox SSD系列3——损失计算 PriorBox SSD采用PriorBox来进行区域生成&#xff0c;其思想与Faster RCNN的Anchor类似。PriorBox的本质是在原图上的一系列矩形框&#xff0c;即特征图上的一个点根据下采样率可以得到在…

创新驱动 共建生态|鲲鹏开发者峰会2023·GBASE南大通用技术论坛成功举办

5月7日&#xff0c;鲲鹏开发者峰会2023 GBASE南大通用技术论坛如约而至&#xff0c;吸引了数十位数据库技术专家、开发者参与讨论。本次论坛是GBASE南大通用联合openGauss社区、行业用户和生态伙伴共同举办的交流分享活动&#xff0c;邀请到包括鲲鹏计算产品部部长颜叶、四川信…

【Linux Network】序列化和反序列化

目录 1. 序列化和反序列化的简单介绍 2. 使用 json 组件完成数据的序列化和反序列化 1. 安装 jsoncpp 组件 2. 序列化 3. 反序列化 Linux网络编程✨ 1. 序列化和反序列化的简单介绍 序列化&#xff1a;将一个结构体数据转化为字符串数据&#xff1b; 反序列化&#xff1a;将…

Mysql 学习(十)基于成本的优化 一

什么是成本 执行一个查询可以有不同的执行方案&#xff0c;优化器会选择一个成本比较低的方案去执行&#xff0c;但是现在有个疑问&#xff0c;MySQL的查询执行成本是哪些呢&#xff1f;主要有两方面组成&#xff1a; I/O成本&#xff1a;myisam和innodb存储引擎将数据和索引存…

盘点慢查询原因及优化方法

目录 一&#xff0c;前言二&#xff0c;准备type重点看 三&#xff0c;慢查询原因和解决1&#xff0c;sql未加索引2&#xff0c;索引失效3&#xff0c;limit深分页问题&#xff08;1&#xff09;limit深分页为什么会慢&#xff08;2&#xff09;深分页优化 4&#xff0c;in元素…

网安笔记 09 PKI PMI

PKI PMI PKI 公钥基础设施 public key infrastructure 遵循标准的&#xff0c;利用公钥理论和技术建立的提供安全服务的基础设施 **目的&#xff1a;**身份认证&#xff0c;点滴信息不完整&#xff0c;不可抵赖&#xff0c;提供可靠安全服务 **任务&#xff1a;**可信任数字…