嵌入式培训之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   

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

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

相关文章

Python字典:数据操作的核心容器

在Python编程生态中&#xff0c;字典&#xff08;dict&#xff09;是最常用且功能强大的内置数据结构之一。它以键值对&#xff08;Key-Value Pair&#xff09;的形式存储数据&#xff0c;为快速查找、灵活映射关系提供了天然支持。无论是数据清洗、算法实现还是Web开发&#x…

按位宽提取十六进制值

需求&#xff1a;给出一个十六进制值&#xff0c;要求提取high和low位之间的值。比如16ha0f0&#xff0c;这是一个16bit宽的十六进制数0xa0f0&#xff0c;提取[15:12]范围内的值。 def extract_bits(value, high, low):"""从 value 中提取 [high:low] 位的值:p…

LeRobot 项目部署运行逻辑(六)——visualize_dataset_html.py/visualize_dataset.py

可视化脚本包括了两个方法&#xff1a;远程下载 huggingface 上的数据集和使用本地数据集 脚本主要使用两个&#xff1a; 目前来说&#xff0c;ACT 采集训练用的是统一时间长度的数据集&#xff0c;此外&#xff0c;这两个脚本最大的问题在于不能裁剪&#xff0c;这也是比较好…

SSTI模版注入

1、概念 SSTI是一种常见的Web安全漏洞&#xff0c;它允许攻击者通过注入恶意模板代码&#xff0c;使服务器在渲染模板时执行非预期的操作。 &#xff08;1&#xff09;渲染模版 至于什么是渲染模版&#xff1a;服务器端渲染模板是一种Web开发技术&#xff0c;它允许在服务器端…

关于点胶机的精度

一、精度&#xff1a; 1:X/y轴定位精度常通在5个丝左右&#xff0c;Z轴在3个丝左右&#xff0c; 如果采用伺服电机丝杆配置&#xff0c;可提升至于个2丝左右。 2&#xff1a;胶水控制精度&#xff1a;通过喷阀驱动器&#xff0c;气压等参数&#xff0c;实现胶量控制&#xf…

gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master

问题描述&#xff1a; gitee推送更新时&#xff0c;提示&#xff1a; 解决方法&#xff1a; 登录Gitee&#xff0c;进入【个人主页】 点击【个人设置】 更改邮箱的配置&#xff0c;如下&#xff1a; 更改“禁止命令行推送暴露个人邮箱”&#xff0c;将其关闭&#xff1a;

Java如何获取电脑分辨率?

以下是一个 Java 程序示例&#xff0c;用于获取电脑的主屏幕分辨率&#xff1a; import java.awt.*; public class ScreenResolutionExample { public static void main(String[] args) { // 获取默认的屏幕设备 GraphicsDevice device GraphicsEnvironm…

WPF 3D图形编程核心技术解析

一、三维坐标系系统 WPF采用右手坐标系系统&#xff0c;空间定位遵循&#xff1a; X 轴 → 右 Y 轴 → 上 Z 轴 → 观察方向 X轴 \rightarrow 右\quad Y轴 \rightarrow 上\quad Z轴 \rightarrow 观察方向 X轴→右Y轴→上Z轴→观察方向 三维坐标值表示为 ( x , y , z ) (x, y,…

【库(Library)、包(Package)和模块(Module)解析】

在Python中&#xff0c;**库&#xff08;Library&#xff09;、包&#xff08;Package&#xff09;和模块&#xff08;Module&#xff09;**是代码组织的不同层级&#xff0c;而import语句的导入行为与它们密切相关。以下是详细对比和解释&#xff1a; &#x1f4e6; 1. 核心概…

裸机上的 printf:在无操作系统环境下构建 C 标准库

在嵌入式开发和底层系统编程领域&#xff0c;裸机开发是一项极具挑战性但又至关重要的任务。想象一下&#xff0c;在没有操作系统支持的情况下&#xff0c;让 C 语言的标准库函数&#xff0c;如printf正常工作&#xff0c;这听起来是不是很有趣又充满挑战&#xff1f;今天&…

基于STM32F103的智能机械臂识别与控制项目(课件PPT+源代码)

以下是基于 STM32F103 的智能机械臂识别与控制项目的详细介绍&#xff1a; 项目概述 该项目以 STM32F103 为核心控制器&#xff0c;结合多种传感器和技术&#xff0c;实现了机械臂的智能识别与控制功能&#xff0c;可完成仓库货物的识别、搬运等任务&#xff0c;并支持多种控…

Codeforces Round 1023 (Div. 2)

Dashboard - Codeforces Round 1023 (Div. 2) - Codeforces 一个构造问题&#xff0c;我把最大的数放在一个数组&#xff0c;其余数放在另一个数组&#xff0c;就能保证gcd不同 来看代码&#xff1a; #include <bits/stdc.h> using namespace std;int main() {int t;ci…

6.01 Python中打开usb相机并进行显示

本案例介绍如何打开USB相机并每隔100ms进行刷新的代码,效果如下: 一、主要思路: 1. 打开视频流、读取帧 self.cam_cap = cv2.VideoCapture(0) #打开 视频流 cam_ret, cam_frame = self.cam_cap.read() //读取帧。 2.使用定时器,每隔100ms读取帧 3.显示到Qt的QLabel…

JVM——即时编译

分层编译模式&#xff1a;动态平衡启动速度与执行效率 分层编译是现代JVM&#xff08;如HotSpot、GraalVM&#xff09;实现高性能的核心策略之一&#xff0c;其核心思想是根据代码的执行热度动态选择不同的编译层次&#xff0c;实现启动速度与运行效率的最佳平衡。以HotSpot虚…

Auto DOP:让并行执行实现智能调优 | OceanBase 实践

随着数据量的迅速增长&#xff0c;企业数据库往往面临着一个困局&#xff1a;复杂的分析查询需要充分的资源来保证性能&#xff0c;但过多增加并行执行又会造成资源竞争&#xff0c;影响系统稳定性。传统基于DBA人工干预的并行度调节机制&#xff0c;既低效又难以适应动态变化的…

【区块链】Uniswap之滑点(Slippage)

一、滑点是什么&#xff1f; 滑点&#xff08;Slippage&#xff09;是指你下单预期价格和最终成交价格之间的差距。 在 DEX 中&#xff0c;你的交易会影响池子的价格&#xff08;AMM机制&#xff09;&#xff0c;所以&#xff1a; 下单越大&#xff0c;滑点越大&#xff1b;…

[前端]Javascript获取元素宽度

元素宽度属性对比示意图 ---------------------------------- | 外边距&#xff08;margin&#xff09; | -------------------------------- | | 边框&#xff08;border&#xff09; | | | -------------------------- | | | …

数字人驱动/动画方向最新顶会期刊论文收集整理 | AAAI 2025

会议官方论文列表&#xff1a;https://ojs.aaai.org/index.php/AAAI/issue/view/624 以下论文部分会开源代码&#xff0c;若开源&#xff0c;会在论文原文的摘要下方给出链接。 语音驱动头部动画/其他 EchoMimic: Lifelike Audio-Driven Portrait Animations through Editabl…

Windows系统下【Celery任务队列】python使用celery 详解(一)

Celery 是一个基于 Python 的分布式任务队列框架&#xff0c;它允许你在不同的进程甚至不同的服务器上异步执行任务。 特点 简单&#xff1a;易于使用和配置&#xff0c;提供了简洁的 API。高可用&#xff1a;支持任务的可靠交付&#xff0c;即使在出现故障时也能保证任务不丢…

移动设备常用电子屏幕类型对比

概述 LCD 家族 &#xff08;TN、STN、TFT、IPS、VA&#xff09;依赖背光&#xff0c;性能差异主要来自液晶排列和驱动方式。OLED 以自发光为核心优势&#xff0c;但成本与寿命限制其普及。E-Paper 专为低功耗静态显示设计&#xff0c;与传统屏幕技术差异显著。 参数LCD&#…