嵌入式全栈开发学习笔记---C语言笔试复习大全23

目录

联合体

联合体的定义

联合体的长度

如果来判断设备的字节序?

如何把大端数据转换成小端数据?

枚举

枚举的定义


上一篇复习了结构体,这一节复习联合体和枚举。

说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。

这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。

注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!

vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。

我们正式开始:

联合体

为什么要学习联合体?

结构体有个缺点就是比较占内存,因为我们每次使用结构体时要给里面的每个成员都开辟空间,但是有时候我们只需要用到里面的某个成员,而不是全部,我们只想为我们使用到的成员申请空间,但是其他成员又不能直接删掉,因为我们有时候还会使用到其他成员,所以怎么办呢?这个时候联合体就派上了用场。

联合体又叫共用体。是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。联合体可以带有多个成员,但是任何时候只能有一个成员带有值。联合体提供了一种使用相同的内存位置的有效方式。

联合体的定义

定义联合体需要用到union关键字。union 语句定义了一个新的数据类型,带有多个成员。

union 语句的格式如下:

union 共用体名

{          

        成员表列

};

联合体的长度

例如:

union test

{

        int a;

        int b;

        char c;

};

它的总长度是4

联合体的特点:

  1. 联合体的所有成员共享同一块内存空间;
  2. 联合体大小:只为最长成员分配空间;

如果我们给a初始化为100,test.a=100;

由于内存是同一个空间,我们访问a,即是访问b,因此当我们打印b的时候,结果也是100,如果访问char c情况就有可能不一样,因为我们不知道c是在4个字节的哪一端,取决于电脑的字节序。

笔试的时候经常用联合体来判断设备的字节序。(这个我们在复习一维数组的时候就已经提到过了)

小端字节序:低字节存放在低地址,高字节存放在高地址。

大端字节序:高字节存放在低地址,低字节存放在高地址。

注意:数组无疑是:数组元素的地址是从低地址到高地址,比如a[0]存放在低地址,a[4]存放在高地址。

如果来判断设备的字节序?

示例:

假设联合体:

union test

{

        char ch[2];

        short val;

};

我们让val=0x0102;这个是16进制,里面有两个字节,分别为0000 0001(高字节)和0000 0010(低字节),我们由于ch和val共享一个空间,那么我们只要判断0000 0001是放在了ch[0](低地址)还是放在了ch[1](高地址)就能知道设备是小端字节序还是大端字节序了。

参考代码:

#include <stdio.h>

union test
{
	char ch[2];//两个字节
	short val;//short是两个字节
};

int main()
{
	//定义联合体变量
	union test t;
	t.val=0x0102;
	if(t.ch[0]==1&&t.ch[1]==2)
	{
		printf("big\n");
	}
	else if(t.ch[0]==2&&t.ch[1]==1)
	{
		printf("small\n");
	}
	return 0;	
}

运行结果:

该设备为小端字节序,一般来说电脑或者我们使用的开发板一般都是小端字节序。

如何把大端数据转换成小端数据?

我们只需要将高字节和低字节调换位置即可

示例:

假设int num=1; 0000 0000 0000 0000 0000 0000 0000 0001,这个1属于低字节,现在要求将它挪到高字节。

提示:将低字节取出来通过位移运算移动到高字节。

参考代码:

#include <stdio.h>

int main()
{
	int num=1;
	printf("%d\n", ((num & 0x000000ff)<<24)|(num &0x0000ff00<<8)|(num &0x00ff0000>>8)|(num &0xff000000>>16));
	return 0;
	
}

运行结果:

用计算器计算的结果也是16777216

枚举

枚举的关键字:enum

枚举和宏定义有点类似。但是有些情况宏定义显得有点繁琐,比如给每个星期的英文缩写重新定义一个数字, 那么我们需要写:

#define MON 1

#define TUE 2

#define WED 3

......

一个星期7天,那我们重复宏定义7次,这样就显得有点繁琐了,因此我们需要用到枚举。

枚举的定义

enum weekday //这个weekday在这里可以不用也写

{

        sun,mon,tue,wed,thu,fri,sat

};

虽然枚举中我们并没有给sun,mon,tue,wed,thu,fri,sat定义0,1,2,3,....但是编译器会默认sun是0,mon是1,tue是2....这样就可以申请繁琐的定义操作。

当然如果你不想要枚举默认,那么你也可以自己指定,比如

enum

{

        sun,mon=11,tue,wed,thu,fri,sat

};

当我们这样讲mon定义成11时,那么后面的tue也就跟着变成12了,依次递增。

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

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

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

相关文章

【资讯】5月巴塞罗那,东胜物联边缘计算网关亮相IOTSWC AWS展台

2024年5月21-23日&#xff0c;物联网解决方案世界大会 IOT SWC 在巴塞罗那举行&#xff0c;这是数字化转型趋势和颠覆性技术的顶级盛会。 作为AWS的硬件合作伙伴&#xff0c;东胜物联网边缘计算网关DSGW-210将在AWS展台1号馆展出&#xff0c;欢迎大家前来参观。 此次东胜在AW…

【Linux】写时拷贝技术COW (copy-on-write)

文章目录 Linux写时拷贝技术(copy-on-write)进程的概念进程的定义进程和程序的区别PCB的内部构成 程序是如何被加载变成进程的&#xff1f;写时复制&#xff08;Copy-On-Write, COW&#xff09;写时复制机制的原理写时拷贝的场景 fork与COWvfork与fork Linux写时拷贝技术(copy-…

阿里云、百度云和移动云的对象存储横向性能对比

文章目录 前言一、对比测试的方法和标准A. 测试环境的设置 二、对比测试的结果A、阿里云OSS测试结果2.B. 百度云结果C. 移动云结果分析与结论 总结 前言 在企业的数字化转型进程中&#xff0c;我们观察到越来越多的公司将其IT基础设施迁移到云端。随着企业业务的持续运营&…

5.Redis之常用数据结构单线程模型

围绕每个数据结构介绍相关命令当前版本的redis支持10个数据类型 Redis 底层在实现上述数据结构的时候,会在源码层面,针对上述实现进行特定的优化,来达到 节省时间/节省空间 效果,内部的具体实现的数据结构&#xff08;编码方式&#xff09;,还会有变数redis 承诺,现在我这有个 …

pikachu靶场中的CSRF、SSRF通关

目录 1、CSRF介绍 2、CSRF&#xff08;get&#xff09; 3、CSRF&#xff08;post&#xff09; 4、CSRF Token 5、SSRF介绍 6、SSRF&#xff08;curl&#xff09; 7、SSRF&#xff08;file_get-content&#xff09; 8、CSRF与SSRF的区别 最近在学习CSRF、SSRF漏洞&#…

LeetCode HOT 100:3. 无重复字符的最长字串

1. 链接 . - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 3. 题解 方法一&#xff1a;滑动窗口 哈希表 根据题意&#xff1a; 1. 遍历所有可能的子串——利用滑动窗口表示子串&#xff1b; 2. 保证滑动窗口内不包含重复字符——需要哈希表map记录字符出现的下标。…

PostgreSQL基本使用Schema

参考文章&#xff1a;PostgreSQL基本使用&#xff08;3&#xff09;Schema_pg数据库查询schema-CSDN博客 PostgreSQL 模式&#xff08;Schema&#xff09;可以理解为是一个表的集合&#xff08;或者所属者&#xff09;。 例如&#xff1a;在 MySQL 中&#xff0c;Scheam 是库&…

etcd集群部署

1.etcd介绍 1.1 什么是etcd etcd的官方定义如下: A distributed, reliable key-value store for the most critical data of distributed systemetcd是一个Go语言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值(key value)存储、配置共享和服务发现等…

Nginx-狂神说

Nginx概述 公司产品出现瓶颈&#xff1f; 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应用就够了&#xff0c;然后内部tomcat返回内容给用户。 但是慢慢的&#xff0c;使用我们平台…

C++ 常用UI库

AWTK github gitee doc scons 类似RT-Thread element github C Cross platfrom C GUI libraries&#xff0c;QT可替代方案。调试包 SDL GUI cegui 创作不易&#xff0c; 小小的支持一下吧&#xff01;

如何在Windows 10上对硬盘进行碎片整理?这里提供步骤

随着时间的推移&#xff0c;由于文件系统中的碎片&#xff0c;硬盘驱动器可能会开始以较低的效率运行。为了加快驱动器的速度&#xff0c;你可以使用内置工具在Windows 10中对其进行碎片整理和优化。方法如下。 什么是碎片整理 随着时间的推移&#xff0c;组成文件的数据块&a…

YOLOv10详细解读 | 一文带你深入了解yolov10的创新点(附网络结构图 + 举例说明)

前言 Hello大家好&#xff0c;我是Snu77&#xff0c;继YOLOv9发布时间没有多久&#xff0c;YOLOv10就紧接着发布于2024.5.23号&#xff08;不得不感叹YOLO系列的发展速度&#xff0c;但要纠正大家的观点就是不是最新的就一定最好&#xff09;&#xff01; 本文给大家带来的是…

Unity开发——XLua热更新之Hotfix配置(包含xlua获取与导入)

一、Git上获取xlua 最新的xlua包&#xff0c;下载地址链接&#xff1a;https://github.com/Tencent/xLua 二、Unity添加xlua 解压xlua压缩包后&#xff0c;将xlua里的Assets里的文件直接复制进Unity的Assets文件夹下。 成功导入后&#xff0c;unity工具栏会出现xlua选项。 …

vue3瀑布流示例,左侧菜单根据窗口滚动条进行固定和取消固定,实现瀑布流demo

瀑布流demo的实现效果&#xff1a; 效果说明&#xff1a; 1.使用vue3实现瀑布流效果&#xff1b; 2.瀑布流横向设置5等分&#xff0c;可根据个人需求调整&#xff1b; 3.左侧菜单可根据右侧滚动条滑动时进行固定和取消固定&#xff0c;实现更优的展示效果&#xff1b; 4.瀑…

Django 里html模板

Django 提供两种方式让程序员自定义html模板。 第一种方法 在项目文件夹里的urls.py进行添加 修改代码如下 from django.contrib import admin from django.urls import path from app01 import views # 得添加这行urlpatterns [path(xxx/, views.home), # 添加这行path(…

从0开始学统计-你能区分率和构成比吗?

1.数据的变异度如何描述&#xff1f; 数据的变异度描述了数据集中数值之间的差异或波动程度。常用的描述数据变异度的统计量包括&#xff1a; &#xff08;1&#xff09;范围&#xff08;Range&#xff09;&#xff1a;范围是数据集中最大值与最小值之间的差异&#xff0c;表…

NDIS小端口驱动(九)

PCIe设备难免会遇到一些重置设备的请求&#xff0c;例如重置总线的时候&#xff0c;但是由于NIC网卡的多样性&#xff0c;重置设备确实也有许多要注意的地方&#xff0c;另外还有一些包含WDM的NDIS驱动 微型端口驱动程序硬件重置 微型端口驱动程序必须向 NdisMRegisterMinipo…

重新思考:Netflix 的边缘负载均衡

声明 本文是对Netflix 博客的翻译 前言 ​ 在先前关于Zuul 2开源的文章中&#xff0c;我们简要概述了近期在负载均衡方面的一些工作。在这篇文章中&#xff0c;我们将更详细地介绍这项工作的原因、方法和结果。 ​ 因此&#xff0c;我们开始从Zuul和其他团队那里学习&#…

L01_JVM 高频知识图谱

这些知识点你都掌握了吗&#xff1f;大家可以对着问题看下自己掌握程度如何&#xff1f;对于没掌握的知识点&#xff0c;大家自行网上搜索&#xff0c;都会有对应答案&#xff0c;本文不做知识点详细说明&#xff0c;只做简要文字或图示引导。 类的生命周期 类加载器 JVM 的内存…

CAD二次开发(2)-将直线对象添加到CAD图形文件

1. 准备工作 创建一个类库项目&#xff0c;如下&#xff1a; 2. 分析Line对象 Line类的初始化方法和参数 using Autodesk.AutoCAD.DatabaseServices; Line line new Line();Line 继承Curve 继承Entity 继承DBObject 继承Drawable 继承RXObject 初始化方法有两个&#xf…