0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言结构体用法很多,但是坑也很多

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-01-13 16:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

C语言可谓是编程界的传奇语言,历经几十年,依然排名前列。 前不久还写了一篇文章《2019年11月C语言接近Java》,说了C语言是比较受欢迎的一种语言,有望在年底超过JAVA,再次成为第一名。 本文主要说的是C语言中的结构体,结构体是C语言中重要的一部分内容,也是C语言中常用的一种数据结构。 一、关于结构体在C语言中,结构体(struct)指的是一种数据结构,是C语言中复合数据类型(aggregate data type)的一类。 结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。 结构体的定义如下所示:

structtag{member-list}variable-list; 其中:

struct为结构体关键字;

tag为结构体的标志;

member-list为结构体成员列表,其必须列出其所有成员;

variable-list为此结构体声明的变量。

在一般情况下:tag、member-list、variable-list这3部分至少要出现2个。二、结构体常规定义不同的定义,应用在不同场景,所以,我们编程时需要结合实际情况来定义结构体。

方法1:

定义结构体stu,此时结构体相当于一个类型,比如int,如需使用此结构体,方法同int.

struct stu{ char aa; short bb;intcc;}; struct stu stu1, stu2;

方法2:

定义结构体stu同时定义需要使用的结构体变量stu1, stu2。如后面再需要定义结构体变量,方法同1.

struct stu{ char aa; short bb;intcc;}stu1, stu2; struct stu stu3;

方法3:

定义结构体时,结构体名称缺省,同时定义结构体变量stu1,stu2。但后面不可再定义结构体变量。

struct{ char aa; short bb;intcc;}stu1, stu2;

提示:

这里不能像上面再定义结构体变量:(以下错误)

structstu3;struct stu stu3;

三、使用typedef定义结构体这里先简单说下typedef.

在C和C++编程语言中,typedef是一个关键字。它用来对一个数据类型取一个别名,目的是为了使源代码更易于阅读和理解。它通常用于简化声明复杂的类型组成的结构 ,但它也常常在各种长度的整数数据类型中看到,例如size_t和time_t。 维基百科

方法4:

使用typedef定义结构体同时,给stu结构体别名STU,后续定义可不用使用struct stu,直接使用STU即可。

typedef struct stu{ char aa; short bb;intcc;}STU; STU stu1;

你会发现,其实就是通过关键字typedef,将STU取代了struct stu。

当然,也可以这么用:

struct stu stu1;

上面这种定义就失去了typedef的意思,所以不推荐。

方法5:

使用typedef定义结构体时,省掉结构体第一个别名stu,直接在后面加STU,使用方法同上。

typedef struct{ char aa; short bb; int cc;}STU; STU stu1;

方法6:

还有一种符合语法规则,但意义不大的定义方式。

typedef struct stu{ char aa; short bb; int cc;}; struct stu stu1;

以上这些定义方式算是语法的知识,如果还不懂,请再次复习一下。

四、结构体大小计算

结构体的大小,我相信很多人都没搞明白。实际编程中也是很多地方都在应用,比如:存储、拷贝结构体时都会牵涉到结构体大小的问题。

1.对比两结构体大小,一样吗?

结构体1:

struct stu{ char aa; short bb; char cc;}stu1;

结构体2:

struct stu{ char aa; char bb; short cc;}stu2;

答案是不一样。程序测试得出sizeof(stu1)=6, sizeof(stu2)=4. 2.分析不一样原因

结构体计算要遵循字节对齐原则,一般满足三个准则:

1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;

3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节;

对于上面结构体stu1来说,最大字节:2字节,顺序是 char->short->char:

2个字节

第一个char占一个字节 多的这一个补0,只是占位作用
short 刚好占2个字节
第二个char也占1个 多的这一个补0


对于上面结构体stu2来说,最大字节:2字节,顺序是 char->char->short:

第一个char占一个字节 第二个char占一个字节
short 刚好占2个字节

通过上面两个表格,相信你应该明白了,改成4字节的int,原理一样。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    干货!连接器测试工程师的“红宝书”:设备操作避+SOP+失效分析全流程(2026最新)

    够不够,还是环境太恶劣。 这套资料里,我详细列出了5Why分析法和鱼骨图的具体用法,帮你把失效原因刨根问底。 写在最后 这套资料是我这些年一点一滴积累下来的实战经验,希望能帮到在测试一线奋斗
    发表于 03-18 19:55

    手把手教你学51单片机-C语言

    为何物。要么只是一些很简单的小实验,学完后只能做到点亮个小灯、显示个数字等,C语言指针都没有用到过,综合实践的例子更是一个没有。在学完这类教材后无法深入下去,很难跟实际项目开发衔接起来,于是可能会怀疑
    发表于 03-05 11:47

    C语言主要特点

    。 3.数据类型丰富。C语言提供的数据类型包括整形、浮点型、字符型、数组类型、指针类型、结构体类型和共用体类型等,C99又扩充了复数浮点型、超长整型(long long)和布尔类型(b
    发表于 01-05 07:41

    C语言回调函数原来这么简单

    更加的清晰,能使代码结构的逻辑更加清晰,结构更加好。 那回调函数的到底是什么呢?它又是怎么实现的呢? 这是本次想要简单分析的一个主题。 但是在说回调函数之前,我觉得很有必要先说明一下
    发表于 12-30 06:45

    C语言C++的区别及联系

    class等面向对象的特性和机制。但是,后来经过一步步修订和很多次演变,最终才形成了现如今这个支持一系列重大特性的庞大编程语言。 一、C语言
    发表于 12-24 07:23

    C语言中一些令人震惊的结构介绍

    C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么? int a = 5, b = 7, c;
    发表于 12-23 08:15

    单片机C语言编程的心得

    写这个8*8按键程序的过程中,不管是在自己写还是参考别人程序的过程中,发现自己对C语言有些基本知识点和编程规范有很多不懂的地方,有些是自己以前的编程习惯不好,有些就是基础知识不扎实的表现,所以总结
    发表于 12-08 07:44

    为什么单片机还在用C语言编程?

    的缺陷 高级语言存在的目的是可以实现更为优化的算法,更多的是为了方便的执行方案,但是,高级语言对程序存储空间的占用要比汇编和C语言
    发表于 11-28 07:37

    C语言程序的结构

    ,87LPC764有4KB的Flash ROM,而笔者的程序量只有2KB多点,因而第一个想法是改用C语言作为主要的开发语言,应该不至于导致代码空间不够用。其次,考虑到需要定时功能的模块(或称任务,以下统称任务
    发表于 11-26 08:12

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达
    发表于 11-25 07:48

    STM32 5 个容易踩的外设使用技巧

    STM32是嵌入式开发领域的热门MCU,功能丰富到几乎可以完成所有常见控制任务:GPIO、ADC、UART、定时器、DMA……应有尽有。但是,正因为功能强大,开发中踩的机会随之增多。很多
    的头像 发表于 11-24 19:04 976次阅读
    STM32 5 个容易踩<b class='flag-5'>坑</b>的外设使用技巧

    C语言结构体使用

    型的数据组合。 结构体的声明与定义 结构体的声明一般形式为: c struct 结构体名{ 成员1; 成员2; ... }; //注意分号 例如:
    发表于 11-12 08:30

    C语言的printf基本用法介绍

    中使用频率最高的一个函数一点不为过,每个C语言程序员都应该掌握 printf 的用法,这是最基本的技能。 不过 printf 的用法比较
    发表于 11-12 07:04

    提高篇——C语言核心技术(中文版)

    该资料是“C编程语言”和“C语言链接库”的完整参考手册。这本书的目的是提供一本方便、可靠的手册,辅助日常的编程工作。本书描述C
    发表于 06-13 16:39

    深入理解C语言C语言循环控制

    C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循
    的头像 发表于 04-29 18:49 2230次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制