
结构体及结构体内存对齐讲解
结构体的第一个成员放在地址偏移量为 0 的位置。 其他成员按照对齐数(默认为 8 字节)的倍数对齐。 结构体的总大小为所有成员所占地址的最大值。 嵌套结构体对齐方式与上层结构体相同。
发布日期:2021-05-19 16:31:16
浏览次数:13
分类:精选文章
本文共 1532 字,大约阅读时间需要 5 分钟。
结构体类型的声明与使用
1. 结构体类型的声明
结构体的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构体声明语法
结构体的声明与常规变量类似,但需要使用 struct
关键字。结构与变量可以在同一条语句中定义。
struct tag { member-list;} variable-list;
结构体的示例
// 描述一个学生struct Stu { char name[20]; // 名字 int age; // 年龄 char sex[5]; // 性别 char id[20]; // 学号} stu1, stu2; // 分号不能丢
匿名结构体类型
在结构体声明时,可以选择不为结构体定义标签,这种结构体称为匿名结构体类型。
// 匿名结构体类型struct { int a; char b; float c;} x;struct { int a; char b; float c;} a[20], *p;
上述两个匿名结构体在编译器中被当作不同的类型,直接使用结构体变量时会出错。
2. 结构体变量的定义与初始化
结构体变量定义
结构体变量可以与其类型声明在一起定义。
struct Point { int x; int y;} p1; // 声明类型同时定义变量 p1struct Point p2; // 定义结构体变量 p2
结构体初始化
可以在定义时为结构体变量赋值。
struct Point p3 = { // 初始化 x, y};// 嵌套结构体初始化struct Node { int data; struct Point p; struct Node* next;} n1 = { 10, { // 点 p 的初始化 4, 5 }, NULL};
3. 结构体内存对齐
结构体对齐规则
结构体内存对齐示例
// 结构体对齐示例struct S1 { char c1; int i; char c2;} p1; // 偏移 0struct S2 { char c1; char c2; int i;} p2; // 偏移 8// 结构体嵌套示例struct S4 { char c1; struct S2 s2; double d;} p4;
4. 结构体传参
结构体传递方式
可以通过两种方式传递结构体:
// 传值方式void print1(struct S s) { printf("%d\n", s.num);}// 传地址方式void print2(struct S* ps) { printf("%d\n", ps->num);}
传递方式优劣比较
- 传值方式:适合结构体较小的情况。
- 传地址方式:减少函数调用的开销适合结构体较大的情况。
int main() { // 结构体传参 struct S s = { { 1, 2, 3, 4 }, 1000 }; print1(s); print2(&s); return 0;}
建议传输结构体时采用传地址方式,因其效率更高。
发表评论
最新留言
很好
[***.229.124.182]2025年05月04日 02时39分35秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
iOS_Runtime3_动态添加方法
2019-03-07
Leetcode第557题---翻转字符串中的单词
2019-03-07
Problem G. The Stones Game【取石子博弈 & 思维】
2019-03-07
Java多线程
2019-03-07
openssl服务器证书操作
2019-03-07
我用wxPython搭建GUI量化系统之最小架构的运行
2019-03-07
selenium+python之切换窗口
2019-03-07
重载和重写的区别:
2019-03-07
搭建Vue项目步骤
2019-03-07
账号转账演示事务
2019-03-07
SpringBoot找不到@EnableRety注解
2019-03-07
在Vue中使用样式——使用内联样式
2019-03-07
Explore Optimization
2019-03-07
map[]和map.at()取值之间的区别
2019-03-08
【SQLI-Lab】靶场搭建
2019-03-08
【Bootstrap5】精细学习记录
2019-03-08
Struts2-从值栈获取list集合数据(三种方式)
2019-03-08
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
2019-03-09
VTK:可视化之RandomProbe
2019-03-09