当前位置:首页 » 《我的小黑屋》 » 正文

C语言 之 结构体超详细总结

20 人参与  2024年03月24日 17:35  分类 : 《我的小黑屋》  评论

点击全文阅读


 ? 个人主页:白子寰
? 分类专栏:魔法指针,进阶C++,C语言,C语言题集,C语言实现游戏? 希望得到您的订阅和支持~
? 坚持创作博文(平均质量分78.8+),分享更多关于深度学习、C/C++领域的优质内容!  (希望得到您的关注~)  

目录

结构体的创建

结构体变量的定义和初始化

变量的定义

初始化

结构体嵌套结构体 

 结构体访问成员

方式一:使用 . 访问

方式二:用指针访问

 结构体与函数

结构体内存对齐

对齐规则

示例 

①段代码

②段代码 

 代码结果解释:​

代码结果解释

修改默认对齐数 


 

注:为保证讲解的逻辑性,以下?代码按顺序逐步添加

结构体的创建

举个栗子:创建结构体学生,包含(学号,名字,性别,成绩)

struct student{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩};

 

结构体创建?解释 


 

结构体变量的定义和初始化

变量的定义

struct student{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩}p1;              //定义一:定义变量p1struct student p2;//定义二:定义结构体变量p2

 

初始化

struct student{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩}p1;              //定义一:定义变量p1struct student p2;//定义二:定义结构体变量p2struct student p3 = { 1,"bai","nan",99.9 };//初始化一struct student p4 = { .sex = "nan",.name = "ran",.id = 2,.scorce = 88.8 };//二:指定顺序初始化

 

结构体嵌套结构体 

//出生日期数据struct Data{    int year;      int month;    int day;};struct student{    int id;       //学号    char name[5]; //名字    char sex[4];  //性别    double scorce;//成绩    struct Data birthday;//结构体嵌套结构体}a1 = { 1,"bai","nan",99.9,{2003,8,27} };         //结构体嵌套初始化一struct student a2 = { .birthday = {2006,8,23},.id = 2,.name = "ran",.scorce = 88.8,.sex = "nan" };//结构体嵌套初始化二

 

 结构体访问成员

方式一:使用 . 访问

struct student{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩}p1;              //定义一:定义变量p1struct student p2;//定义二:定义结构体变量p2struct student p3 = { 1,"bai","nan",99.9 };//初始化一struct student p4 = { .sex = "nan",.name = "ran",.id = 2,.scorce = 88.8 };//二:指定顺序初始化int main(){printf("id = %d\nname = %s\nsex = %s\nscorce = %.2lf\n", p3.id, p3.name, p3.sex, p3.scorce);//用 . 访问成员return 0;}

 


 

方式二:用指针访问

struct student{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩}p1;              //定义一:定义变量p1struct student p2;//定义二:定义结构体变量p2struct student p3 = { 1,"bai","nan",99.9 };//初始化一struct student p4 = { .sex = "nan",.name = "ran",.id = 2,.scorce = 88.8 };//二:指定顺序初始化int main(){//访问成员方式一printf("id = %d\nname = %s\nsex = %s\nscorce = %.2lf\n", p3.id, p3.name, p3.sex, p3.scorce);//用 . 访问成员//访问成员方式二struct student* t = &p4;printf("id = %d\nname = %s\nsex = %s\nscorce = %.2lf\n", t->id, t->name, t->sex, t->scorce);//用指针->访问成员return 0;}

 

(*p). 成员名( .  的优先级高于 * ,(*p)两边括号不能少)


 

 结构体与函数

struct student{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩};void print(struct student* p)//形参:结构体指针变量{printf("id = %d\nname = %s\n", p->id, p->name);//打印学号和名字}int main(){struct student p = { 1,"bai","nan",99.9 };//定义p和初始化print(&p);//传p的地址return 0;}

 

控制台输出:


结构体内存对齐

对齐规则

1.结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处

  对齐数 = 编译器默认的⼀个对齐数与该成员变量大小的较小值。

  VS默认对齐数为8

  Linux中gcc没有默认对⻬数,对齐数就是成员自身的大小

3. 结构体总大小为最⼤对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最⼤的)的整数倍。

4. 嵌套结构体,嵌套的结构体成员对齐到自己的成员中最⼤对齐数的整数倍处,结构体的整体大小就是所有最⼤对齐数(含嵌套结构体中成员的对齐数)的整数倍

先看下面?两段代码


 

示例 

①段代码

struct s1{char c1;int i;char c2;};int main(){printf("%zd\n", sizeof(struct s1));return 0;}

 

②段代码 

struct s1{char c1;char c2;int i;};int main(){printf("%zd\n", sizeof(struct s1));return 0;}

 

 代码结果解释:

 
③段代码:嵌套结构体

struct S1{double d;char c;int i;};struct S2{char c1;struct S1 s1;double d;};int main(){printf("%zd\n", sizeof(struct S2));return 0;}

 

代码结果解释

 

小结:结构体的内存对齐是拿空间来换取时间的做法。


 

修改默认对齐数 

#pragma (一个预处理指令):可以改变编译器的默认对齐数

#pragma pack(1)  //设置默认对齐数为1struct s1{char c1;char c2;int i;};//#pragma pack()  //取消默认对齐数,还原为默认int main(){printf("%zd\n", sizeof(struct s1));return 0;}

 

控制台输出:6


 ***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“你只管去做,不要在意别人的目光,最后的结果总是会让人满意的”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。


点击全文阅读


本文链接:http://zhangshiyu.com/post/84918.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1