当前位置: 首页 > article >正文

嵌入式培训之C语言学习完(十七)结构体、共用体、枚举、typedef关键字与位运算

目录

一、结构体(struct关键字)

(一)声明一个结构体数据类型

(二)结构体的成员初始化与赋值

a、结构体变量赋值

b、结构体成员初始化

c、结构体的定义形式

(三)考点:结构体在内存中所占字节数

(四)对结构体成员进行输出

(五)例题

二、共用体(union关键字)

三、枚举(enum关键字)

四、typedef关键字

五、位运算

(一)&  按位与  

(二)|  按位或

(三)^ 按位异或 

(四)~ 取反

(五)<<  左移 

(六)>>  右移

一、结构体(struct关键字)

        结构体类型—用来描述复杂数据的一种类型,它是构造类型的(用户自定义类型)一种。

(一)声明一个结构体数据类型

1、语法:

struct 结构体名//创建抽象的数据类型

{

   成员列表;

}

2、理解:

(1)struct关键字表示在构造一个结构体类型;

(2)结构体名是用来描述结构体这个类型的一个名称;

(3)成员列表,它定义的形式,与之前的定义变量的方式是相同的,也用之前的那些

        数据类型定义,它不仅可以定义变量,还可以定义数组和指针变量;

        多个成员定义变量的时候,注意要用分号隔开

        成员列表表示要描述的复杂数据中用到的具体的成员变量;

(4)特别注意在最后的花括号后面要加一个“;”

3、示例:

4、结构体类型的使用:首先先定义出一个类型,再去定义需要的变量,

定义变量的形式是:struct 结构体名 变量名 即 结构体类型+变量名

eg:struct Student s;

(二)结构体的成员初始化与赋值

a、结构体变量赋值

1、示例:

注:(1)"  .  "为结构体成员运算符,优先级为1级,结合方向自左至右;

       (2)不能写成s.name = "zhangsan";编译报错,数组不能被整体引用。

3、结构体变量与变量之间可赋值,示例:

b、结构体成员初始化

1、形式: struct student s={};
     初始化的时候,看每个成员变量具体是什么数据类型,然后根据各个成员变量自身的数据类型进行初始化;

示例:struct student s={1,"zhangsan",99};//此方法做不到只初始化一个成员

2、初始化次序不能颠倒应与结构体声明顺序保持一致;

3、结构体成员的部分初始化

示例:struct student s={ .id = 1};//其他未初始化的部分全为0;

           struct student s={ .name = "zhangsan" , .score = 99};//用逗号隔开

c、结构体的定义形式

形式1:先定义类型,然后定义变量

  1. struct Student

  2. {

  3. };

  4. struct Student s;

形式2:定义类型的同时定义变量

  1. struct Student

  2. {

  3. }s;

示例:声明结构体的同时定义了两个全局变量(s1,s2)

(三)考点:结构体在内存中所占字节数

内存对齐原则:

1、默认按照计算机位数对齐,64/8=8最终大小必须是8的整数倍;(32位系统下默认4字节对齐)

2、从结构体中的成员中查找最大字节的成员,最终按此成员大小对齐;

3、把每个成员按照声明顺序依次存放入内存,偏移量/sizeof(成员)必须能够整除。

(注:32位的平台 :如果有超过4字节 ,按照4字节对齐;如果没有超过4字节的,则

按成员变量中最大对齐 ;64位的平台:如果超过4字节的,按超过的最大的成员变量对

齐,如果没有超过4字节的,则按成员变量中最大对齐)

示例:

图中代码printf("%lu\n",sizeof(struct Demo));运行结果为12(占12个字节)

注:内存对齐的原因:空间换时间,提高程序运行效率

(四)对结构体成员进行输出

1、->:指向结构体成员运算符;

2、指针用指向结构体成员运算符(->),变量用结构体成员运算符(.);

3、输出函数1:

注:该函数为值传递(过程需要拷贝);不建议使用

4、输出函数2:

注:该函数为指针传参(效率更好)

(五)例题

1、结构体的遍历

2、采用回调函数按学生成绩排序

3、采用qsort函数按学生名字排序

二、共用体(union关键字)

1、共用体:(union)它是共用一块内存空间(共用了最大成员的空间);

2、语法:

union 共用体名

{

   成员变量;

};

3、示例:

4、共用相同的内存空间(所以称为共用体)

运行结果:4(共占4个字节)

5、访问时只有最后被赋值的变量是有效的(彼此内存相互覆盖)

运行结果为1

6、4个字节被3个长度不同的变量共享时,共享总是从起始部分开始共享的(所有成员起始地址是相同的);

7、用共用体判断计算机大小端存储:

三、枚举(enum关键字)

1、含义:将变量的值一个一个列举出来;变量的值只限于列举出来的值的范围内;

2、作用:为了提高代码的可读性;

3、语法

enum 枚举名

{

   列举各种值,//不是成员,是可能的取值(全为常量)

};

注:列举各种值时,用逗号隔开,不需要类型名;

4、注意事项

(1)枚举中逐个列举的值,默认是从0开始;如果有给定的值,则后续没有给值的枚举成员依次加1;

(2)枚举本质是一个int 类型的数据(可以放在switch中使用)

(3)每个值可以用%d输出。

5、示例:

运行结果:sleep

运行结果为4

运行结果为2(列举的值默认从0开始)

运行结果为13(有给定的值,后续没有给值的枚举常量依次+1)

四、typedef关键字

1、typedef——type define

     它的本意不是定义类型,是给已有的数据类型起别名。

eg:

int a ;//定义了一个int 型变量,a为变量名(具体)

typedef int a; //此时a是int类型的类型名(抽象)

2、示例:

运行结果为4

3、作用:避免写长长的关键字;

此时Student为类型的类型名(抽象)

4、不建议使用其简化,代码可读性差

示例:

a为数组整型,运行结果为40

a为函数的指针的数组,sizeof(a)为80

五、位运算

(一)&  按位与  

1、& :双目运算符,优先级为8级,结合方向自左至右;

2、运算规则:一假则假 (任何一个为0,其结果必然为0;两个都为1,其结果为1);

3、作用:指定位清零

4、示例:

1001 1110 
0011 0010 &
-------------------

0001 0010 

(二)|  按位或

1、|:双目运算符,优先级为10级,结合方向自左至右;

2、运算规则:一真则真 (任何一个为1,其结果必然为1;两个都为0,其结果为0);

3、作用:指定位置1

4、示例:

1001 1110 
0011 0010 |
-------------------

1011 1110 

(三)^ 按位异或 

1、^:双目运算符,优先级为9级,结合方向自左至右;

2、运算规则:相同为0,不同为1;

3、作用:指定位翻转,其他位不变

4、示例:

1001 1110 
0011 0010 ^
-------------------

1010 1100

(四)~ 取反

1、~:单目运算符,优先级为2级,结合方向自右至左;

2、运算规则:按位取反(将0变1,1变0);

3、示例:

1001 1110  ~
-------------------

0110 0001

(五)<<  左移 

1、<<:双目运算符,优先级为5级,结合方向自左至右;

2、写法:a<<n  (表示将a这个数据左移n位 )(C语言中为逻辑左移)

3、最高位无论是1还是0全丢掉,后面补0

4、作用:指定位清零( ~(1 << n))

5、示例:

0000 0001 
0000 0010
左移1位  相当于乘 2  

(六)>>  右移

1、>>:双目运算符,优先级为5级,结合方向自左至右;

2、写法:a>>n(表示将 a这个数据 右移 n位)

3、算术右移是看符号位和看数据类型的:

(1)有符号数据类型,右移时,最高位补的是符号位; (算术右移)     

(2)无符号类型的数据,右移时,最高位补的0 ;(逻辑右移

注:在使用右移运算符时最好定义无符号数据类型(eg:unsigned char)

4、示例:

1000

1100

-----------

0100

0010

右移1位  相当于除 2   

相关文章:

嵌入式培训之C语言学习完(十七)结构体、共用体、枚举、typedef关键字与位运算

目录 一、结构体&#xff08;struct关键字&#xff09; &#xff08;一&#xff09;声明一个结构体数据类型 &#xff08;二&#xff09;结构体的成员初始化与赋值 a、结构体变量赋值 b、结构体成员初始化 c、结构体的定义形式 &#xff08;三&#xff09;考点&#xff…...

极狐GitLab 命名空间的类型有哪些?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 命名空间 命名空间在极狐GitLab 中组织项目。因为每一个命名空间都是单独的&#xff0c;您可以在多个命名空间中使用相同的项…...

N6715C 基础型定制配置直流电源分析仪

N6715C 基础型定制配置直流电源分析仪 综述 N6715C 是一款可定制的直流电源分析仪系统&#xff0c;在装运之前已经过全面测试并组装完毕。 每台 N6715C 包括一个 N6705C 主机和 1 至 4 个模块。 模块作为 E6715C 的选件订购。 主要特点 ◆ ◆ 4 插槽主机最多可安装 4 个模块…...

4.1【LLaMA-Factory 实战】医疗领域大模型:从数据到部署的全流程实践

【LLaMA-Factory实战】医疗领域大模型&#xff1a;从数据到部署的全流程实践 一、引言 在医疗AI领域&#xff0c;构建专业的疾病诊断助手需要解决数据稀缺、知识专业性强、安全合规等多重挑战。本文基于LLaMA-Factory框架&#xff0c;详细介绍如何从0到1打造一个垂直领域的医…...

《软件项目经济性论证报告模板:全面解析与策略建议》

《软件项目经济性论证报告模板:全面解析与策略建议》 一、引言 1.1 项目背景阐述 在数字化浪潮席卷全球的当下,各行业对软件的依赖程度日益加深。[行业名称] 行业也不例外,随着业务规模的不断扩张、业务复杂度的持续提升以及市场竞争的愈发激烈,对高效、智能、定制化软件…...

腾讯云:数字世界的“量子熔炉”与硅基文明引擎​

​​一、算力拓扑学&#xff1a;重新定义空间的计算密度​​ 腾讯云的算力网络正在突破经典物理限制&#xff0c;其分布式架构通过“量子化”资源调度实现超维计算&#xff1a; ​​虚拟化跃迁​​&#xff1a;基于KVM的轻量级虚拟化技术&#xff0c;将单台物理服务器切割为百…...

Android 项目中配置了多个 maven 仓库,但依赖还是下载失败,除了使用代理,还有其他方法吗?

文章目录 前言解决方案gradlemaven 仓库 前言 我们在Android 开发的过程中&#xff0c;经常会遇到三方依赖下载不下来的问题。一般情况下我们会在项目的build.gradle文件中配置多个 maven 仓库来解决。 // Top-level build file where you can add configuration options com…...

关税冲击下,FBA国际物流企业如何靠智能拓客跑出增长“加速度”?

国际物流行业正迎来前所未有的增长机遇。据中研普华最新报告&#xff0c;2025年全球物流市场规模已突破6.27万亿美元&#xff0c;其中中国跨境物流市场预计达2.71万亿元。在全球化与数字化双轮驱动下&#xff0c;国际物流从“规模扩张”迈向“价值重构”。可以说&#xff0c;国…...

vue源代码采用的设计模式分解

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…...

【java反射修改注解属性】java 通过反射,动态修改注解的某个属性值

有些情况为了偷懒&#xff0c;往往会使用注解来动态处理一些功能&#xff0c;比如Excel的导入以及导出等。但是一些情况下我们需要动态的修改注解的属性值&#xff0c;来完成一些特定场景的业务需求。 java动态修改注解的属性代码 public void updateFieldAnnotationVal(String…...

使用 JavaScript 实现数据导出为 Excel 和 CSV 文件

在 Web 开发中&#xff0c;经常会遇到需要将数据导出为文件的需求&#xff0c;例如将数据导出为 Excel 或 CSV 文件。今天&#xff0c;我们就来探讨如何使用 JavaScript 实现这一功能。 一、实现思路 我们通过 HTML 创建一个按钮&#xff0c;点击按钮时&#xff0c;触发 Java…...

eNSP中路由器RIP协议配置完整实验实验和命令解释

一、实验拓扑 二、配置命令 R1配置并先测试一下连通性 R1、R2和R3接口配置完后再测试连通性&#xff0c;直连路由可通 启动RIP进程&#xff0c;宣告直连网络 查看路由表&#xff0c;测试连通性 环回接口配置 三、命令解释及注意事项 配置命令逐行解释 system-view: 从用户视…...

密码学--AES

一、实验目的 1、完成AES算法中1轮加密和解密操作 2、掌握AES的4个基本处理步骤 3、理解对称加密算法的“对称”思想 二、实验内容 1、题目内容描述 &#xff08;1&#xff09;利用C语言实现字节代换和逆向字节代换&#xff0c;字节查S盒代换 &#xff08;2&#xff09;利…...

Vue项目中实现自定义连线图

需求描述 在vue项目中实现由自定义块元素组成的连线图。效果图 实现思路 Leader-Line 是一个用于 Web 的轻量级 JavaScript 库&#xff0c;专为创建从一个元素指向另一个元素的引导线而设计。它提供了高度自定义的能力&#xff0c;使得开发者能够轻松地在网页上实现各种指引用…...

linux中的日志分割

1.问题背景&#xff0c;nginx日志过大不好删除 [rootlocalhost cron.daily]# cd /lk/nginx/log/ [rootlocalhost log]# ll 总用量 2386188 -rw-r--r--. 1 root root 2078699697 5月 9 13:02 access.log -rw-r--r--. 1 root root 11138 5月 6 10:28 error.log [rootloc…...

C++编程语言:标准库:标准库概观(Bjarne Stroustrup)

第30章 标准库概观(Standard-Library Overview) 目录 30.1 引言 30.1.1 标准库设施 30.1.2 设计约束 30.1.3 描述风格 30.2 头文件 30.3 语言支持 30.3.1 对initializer_list的支持 30.3.2 对范围for的支持 30.4 异常处理 30.4.1 异常 30.4.1…...

独立自主的网络浏览器——Ladybird

独立自主的网络浏览器——Ladybird 随着互联网技术的飞速发展&#xff0c;浏览器作为人们探索网络世界的窗口&#xff0c;其技术创新和安全措施至关重要。然而&#xff0c;市场上绝大多数浏览器都是基于现有的成熟引擎进行开发&#xff0c;如何创新突破&#xff0c;成为一个独…...

Shiro(八):JWT介绍

1、什么是JWT&#xff1f; JWT&#xff08;JSON Web Token&#xff0c;JSON Web令牌&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应 用环境间安全地传递声明&#xff08;claims&#xff09;作为JSON对象&#xff1b;JWT会按指定的加密算…...

【HDLBits刷题】Verilog Language——1.Basics

目录 一、题目与题解 1.Simple wire&#xff08;简单导线&#xff09; 2.Four wires&#xff08;4线&#xff09; 3.Inverter&#xff08;逆变器&#xff08;非门&#xff09;&#xff09; 4.AND gate &#xff08;与门&#xff09; 5. NOR gate &#xff08;或非门&am…...

SCDN是什么?

SCDN是安全内容分发网络的简称&#xff0c;它在传统内容分发网络&#xff08;CDN&#xff09;的基础上&#xff0c;集成了安全防护能力&#xff0c;旨在同时提升内容传输速度和网络安全性。 SCDN的核心功能有&#xff1a; DDoS防御&#xff1a;识别并抵御大规模分布式拒绝服务…...

Python 常用内置函数详解(十):help()函数——查看对象的帮助信息

目录 一、语法参考二、示例 一、语法参考 help() 函数的语法格式如下&#xff1a; 参数说明&#xff1a; request&#xff1a;可选参数&#xff0c;要查看其帮助信息的对象&#xff0c;如类、函数、模块、数据类型等&#xff1b;返回值&#xff1a;返回对象的帮助信息。 二…...

【Python系列】Python 中的 HTTP 请求处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

辉芒微离线烧录器“文件格式错误”问题解决

最近在使用辉芒微离线烧录器烧录程序时&#xff0c;提示“文件格式错误”&#xff0c;记录一下解决方法。 一、问题现象 经过多次尝试和排查&#xff0c;发现以下几种情况&#xff1a; 情况一&#xff1a;使用离线烧录器导入固件1&#xff08;boot程序&#xff09;&#xff0c…...

buck和boost总结

目录 1. 基本概念与原理 2. 工作模式 3. 典型应用场景 4. Buck-Boost电路&#xff1a;升降压结合 5. 核心区别与选择 1. 基本概念与原理 Buck电路&#xff08;降压电路&#xff09; 通过开关器件&#xff08;如MOSFET&#xff09;周期性地导通和关断&#xff0c;控制电感充…...

Ansible内置模块之package

原创&#xff1a;厦门微思网络 Ansible内置模块之 package ansible.builtin.package 模块用于管理基于 Linux 系统上的软件包。它是一个通用模块&#xff0c;支持多个包管理器&#xff08;如 apt、yum、dnf、zypper 等&#xff09;&#xff0c;可以安装、更新和删除软件包。其…...

RISC-V AIA SPEC学习(五)

第六章 Interrupts for Virtual Machines(VS Level) 核心内容 1.VS级别外部中断支持:​​ ​​客户中断文件(Guest Interrupt File)​​:虚拟机的每个vCPU拥有独立的IMSIC中断文件,允许直接接收设备MSI。​​vstopi CSR​​:类似stopei,用于虚拟机内部处理最高优先级中…...

【软件设计师:体系结构】15.计算机体系结构概论

计算机体系结构是指计算机系统的功能和属性,是程序员所看到的计算机的属性。它主要研究计算机体系的概念性结构和功能特性,包括指令集、数据类型、存储器寻址技术、I/O机制等。例如,计算机是否具备乘法指令的功能,这是一个体系结构的问题。 一、机内代码及运算 一、数的进…...

CVE-2025-24813:Apache Tomcat RCE 漏洞分析

CVE-2025-24813 是 Apache Tomcat 中的一个严重远程代码执行 (RCE) 漏洞,源于路径等效缺陷,允许攻击者绕过安全约束并远程执行任意代码。 CYFIRMA 的研究发现了一些活跃的漏洞利用,一些 PoC 漏洞在地下论坛上流传。攻击者利用基于 HTTP PUT 的任意文件上传、NTFS 连接漏洞利…...

vscode 配置doxygen注释和snippet

vscode 配置doxygen注释和snippet Doxygen的C/C注释原则 基于Doxygen的C/C注释原则 标注总述 1.文件头标注 2. 命名空间标注 3. 类、结构、枚举标注 4. 函数注释原则 5. 变量注释 6. 模块标注 7. 分组标注指令表格 命令字段名语法file文件名file [< name >]brief简介b…...

分析 Docker 磁盘占用

以下是分析 Docker 磁盘占用的详细步骤和工具指南&#xff0c;帮助开发者快速定位和清理冗余数据&#xff1a; 1. 查看 Docker 磁盘使用概览 docker system df 输出说明&#xff1a; TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 15 …...