美文网首页
C语言结构体用法很多,坑也很多

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

作者: 哪有岁月静好 | 来源:发表于2020-07-08 16:46 被阅读0次

C语言可谓是编程界的传奇语言,历经几 十 年,依然排名前列。

本文主要说的是C语言中的结构体,结构体是C语言中重要的一部分内容,也是C语言中常用的一种数据结构。

一、关于结构体

在C语言中,结构体(struct)指的是一种数据结构,是C语言中复合数据类型(aggregate data type)的一类。

结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

结构体的定义如下所示:

struct tag { 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;

 int   cc;

};

struct  stu stu1, stu2;

方法2:

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


struct  stu

{

 char  aa;

 short bb;

 int   cc;

}stu1, stu2;

struct  stu stu3;

方法3:

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


struct

{

 char  aa;

 short bb;

 int   cc;

}stu1, stu2;

提示:

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


struct  stu3; 

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;

 int   cc;

}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;

以上这些定义方式算是语法的知识,如果还不懂,请再次复习一下。或者参考《 一句话帮你理解typedef的用法 》。

四、结构体大小计算

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

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:

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

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

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

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

其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。



相关文章

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

    C语言可谓是编程界的传奇语言,历经几 十 年,依然排名前列。 本文主要说的是C语言中的结构体,结构体是C语言中重要...

  • C语言学习笔记-结构体占用内存大小的计算

    引言 结构体在C语言中虽然经常使用,但是怎么计算一个结构体占用多大的内存,很多C语言的新手都没注意过,其实C语言的...

  • C语言和OC的结构体(struct)

    Struct(结构体) 1.结构体定义 2.结构体变量 3.结构体数组 4.C语言结构体指针 5.C语言共用体 6...

  • C语言结构体

    结构体 本文介绍C语言结构体,struct 在C++中功能相对C较多,相当于类,这里暂时不讨论,本文单独讨论C语言...

  • 嵌入式学习笔记19.11.25

    c语言结构体 结构体一般定义全局变量 struct stu{//struct 定义结构体 stu 结构体名称 in...

  • 12-Go语言结构体

    结构体 结构体的基本概念 什么是结构体Go语言中的结构体几乎和C语言中的结构体一模一样都需要先定义结构体类型, 再...

  • 结构体与指针

    1.1 Linux C语言结构体 简介:本课程深入的讲解了C语言中,预处理是怎么回事,结构体和公用体又是如何使用及...

  • c语言中的结构体

    结构体是 C 语言主要的自定义类型方案,这篇就来认识一下结构体。 一、结构体的形态 C源程序(struct.c):...

  • 闲聊C语言结构体

    结构体是 C 语言主要的自定义类型方案,这篇就来认识一下结构体。 一、结构体的形态 C源程序(struct.c):...

  • 深入理解Runtime中的isa

    objc_object Objective-C 所有对象都是 C 语言结构体objc_object,这个结构体中包...

网友评论

      本文标题:C语言结构体用法很多,坑也很多

      本文链接:https://www.haomeiwen.com/subject/ilvccktx.html