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,原理一样。

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

    评论

    相关推荐

    在学习go语言的过程踩过的

    作为一个5年的phper,这两年公司和个人都在顺应技术趋势,新项目慢慢从php转向了go语言,从2021年到现在,笔者手上先后开发了两个go项目。在学习go语言的过程中学习并总结了
    的头像 发表于 11-11 09:22 159次阅读

    C语言C++中结构体的区别

    同样是结构体,看看在C语言C++中有什么区别?
    的头像 发表于 10-30 15:11 199次阅读

    OP07C输入是0的时候,偏置电压比datasheet上面的大很多,为什么?

    根据OP07C的datasheet的第五页,此运放的偏置电压是典型是60uV,我使用TINA仿真的结果如下图 发现输入是0的时候,这个偏置电压比datasheet上面的大很多啊?这个是为什么呢?
    发表于 09-04 08:12

    为什么OPA365的带宽要高很多但是波形如此失真?

    您好,最近遇到了运放电流采样的相关问题。我按照如图所示的电流采样电路进行电流采样,,我想取得100K-200K的高频成分同时还需要直流分量。相同的电路分别使用了两种运放,分别是OPA376和OPA365,测试波形如图所示。不知道为什么OPA365的带宽要高很多但是波形
    发表于 08-02 07:44

    技术干货驿站 ▏深入理解C语言:掌握程序结构知识

    在计算机编程的世界中,C语言被广泛认可为一门强大而高效的编程语言,其简洁的语法和直接的指令使得它成为了许多程序员的首选。了解C语言的程序
    的头像 发表于 07-27 08:45 1357次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:掌握程序<b class='flag-5'>结构</b>知识

    嵌入式中C语言结构体基本实现

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构C语言编程中允许您存储不同数据类型的
    的头像 发表于 05-11 08:49 1013次阅读
    嵌入式中<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>结构</b>体基本实现

    很多薄膜电容寿命很短,这是怎么回事呢?

    很多客户在选择薄膜电容的时候,会重视产品质量,一般都会先对电容样品进行测试,性能没有问题以后才会大量选用。
    的头像 发表于 03-29 14:17 519次阅读

    C语言结构体史上最详细的讲解【软件干货】

    struct结构体数据类型 前言 我们知道,在C语言中有一些基本的数据类型,如 char int float long double string(c99) 等等数据类型,他们可以表示
    的头像 发表于 03-28 17:52 746次阅读

    嵌入式系统中C语言结构体的基础实现与应用

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构C语言编程中允许您存储不同数据类型的
    发表于 03-12 14:29 494次阅读
    嵌入式系统中<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>结构</b>体的基础实现与应用

    C语言的指针用法

    C语言编程中善用指针可以简化一些任务的处理,而对于一些任务(比如动态内存分配),必须要有指针才行的。也就是说精通C指针编程是很有必要的,帮助你成为一名优秀的Cer。
    发表于 03-05 14:22 346次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的指针<b class='flag-5'>用法</b>

    C语言编程的七大陷阱与高效避指南

    在微控制器单元(MCU)开发领域,C语言因其接近硬件的特性、高效性和灵活性而广泛应用。
    的头像 发表于 02-21 09:09 516次阅读

    plc编程语言c语言的联系 c语言和PLC有什么区别

    语言,主要用于开发各种应用程序。尽管PLC编程语言C语言有一些相似之处,但它们之间存在一些明显的区别。 首先,PLC编程
    的头像 发表于 02-05 14:21 4097次阅读

    vb语言c++语言的区别

    Microsoft开发的一种面向对象的事件驱动编程语言。它的设计目标是简化编程过程,让初学者能快速上手。与之相比,C++语言是一种通用的、面向对象的编程
    的头像 发表于 02-01 10:20 2263次阅读

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析  在C语言中,访问权限冲突异常通
    的头像 发表于 01-12 16:03 5647次阅读

    C语言数据结构之跳表详解

    大家好,今天分享一篇C语言数据结构相关的文章--跳表。
    的头像 发表于 12-29 09:32 825次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>数据<b class='flag-5'>结构</b>之跳表详解