嵌入式C语言面试相关知识------结构体和联合体
一、博客声明
又是一年一度的秋招,怎么能只刷笔试题目呢,面试题目也得看,想当好厂的牛马其实也不容易呀O(∩_∩)O。注意:这篇博客大部分是来自网上的资源,通过自问或者他问,然后寻找答案,为了加深印象,总结或者抄一遍。
二、结构体
1、数组概念
结构体是一种聚合数据类型,它允许将多个类型不同的变量组成一个整体。每个成员都有自己的内存空间,并且可以同时访问。
2、如何声明定义数组
常用的就是基本结构体声明和使用typedef
进行声明。
c
struct Person {
char name[50];
int age;
}; //结构体类型的定义
struct Person p1; //定义结构体变量
下面是使用typedef进行定义/
typedef struct {
char name[50];
int age;
} Person;
Person p1;
3、数组特点
- 独立的内存空间: 结构体中的每个成员都有自己独立的内存位置,存储多个不同类型的数据。
- 按顺序存储: 结构体中的成员按照定义的顺序排列在内存中。
- 访问方式: 使用成员访问符号
.
来访问结构体的成员。 - 内存大小: 结构体的总大小是所有成员大小之和,但可能存在内存对齐而导致的填充。
三、联合体
1、联合体概念
联合体是一种特殊的数据类型,允许多个成员共用一块内存空间。即所有成员的值存储在同一个内存位置,任意时刻只能存储一个成员的数据。
2、如何声明定义联合体
c
union MyUnion {
int a;
float b;
char c;
}; //联合体类型的定义
union MyUnion myunion; //定义联合体变量
下面是使用typedef进行定义/
typedef union {
int a;
float b;
char c;
} Data; //联合体类型的定义
Data data;
3、联合体特点
- 共用内存空间: 联合体的所有成员共享一块内存,只有最大的那个成员决定联合体的大小。
- 只能存储一个值: 因为所有成员共享内存,所以一个时间点只能存储一个成员的值,存储一个新成员会覆盖之前的值。
- 访问方式: 与结构一样用
.
符号来访问联合体成员。 - 内存大小: 占用内存最大的变量。
四、两者区别
特性 | 结构体 (struct) | 联合体 (union) |
---|---|---|
内存分配 | 每个成员有独立的内存空间 | 所有成员共用同一块内存 |
大小 | 大小是所有成员的大小决定,具体看如何对齐 | 取决于最大成员的大小 |
同时存储 | 可以同时存储多个成员的数据 | 任意时刻只能存储一个成员的数据 |
数据访问 | 各成员可以独立访问,互补影响 | 访问一个成员会覆盖其他成员的数据 |
典型用途 | 用于存储一组相关的数据 | 用于存储多种类型的值,任意时刻只存一种 |
内存使用效率 | 内存利用率相对较低,占用空间多 | 内存利用率高,但风险大,数据容易被覆盖 |