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

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

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

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

[[320277]]

一、关于结构体

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

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

结构体的定义如下所示:

  1. struct tag { member-list } variable-list;  

其中:

  • struct为结构体关键字;
  • tag为结构体的标志;
  • member-list为结构体成员列表,其必须列出其所有成员;
  • variable-list为此结构体声明的变量。

在一般情况下:tag、member-list、variable-list这3部分至少要出现2个。

二、结构体常规定义

不同的定义,应用在不同场景,所以,我们编程时需要结合实际情况来定义结构体。

方法1:

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

  1. struct stu 
  2.     char  aa; 
  3.     short bb; 
  4.     int   cc; 
  5. }; 
  6.  
  7. struct stu stu1, stu2; 

方法2:

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

  1. struct stu 
  2.     char  aa; 
  3.     short bb; 
  4.     int   cc; 
  5. }stu1, stu2; 
  6.  
  7. struct stu stu3; 

方法3:

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

  1. struct 
  2.     char  aa; 
  3.     short bb; 
  4.     int   cc; 
  5. }stu1, stu2; 

提示:

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

  1. struct stu3;  
  2. struct stu stu3; 

三、使用typedef定义结构体

这里先简单说下typedef。

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

维基百科

方法4:

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

  1. typedef struct stu 
  2.     char  aa; 
  3.     short bb; 
  4.     int   cc; 
  5. }STU; 
  6.  
  7. STU stu1; 

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

当然,也可以这么用:

  1. struct stu stu1; 

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

方法5:

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

  1. typedef struct 
  2.     char  aa; 
  3.     short bb; 
  4.     int   cc; 
  5. }STU; 
  6.  
  7. STU stu1; 

方法6:

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

  1. typedef struct stu 
  2.     char  aa; 
  3.     short bb; 
  4.     int   cc; 
  5. }; 
  6.  
  7. struct stu stu1; 

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

四、结构体大小计算

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

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

结构体1:

  1. struct stu 
  2.     char  aa; 
  3.     short bb; 
  4.     char  cc; 
  5. }stu1; 

结构体2:

  1. struct stu 
  2.     char  aa; 
  3.     char  bb; 
  4.     short cc; 
  5. }stu2; 

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

2. 分析不一样原因

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

  • 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
  • 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
  • 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节;

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

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

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

最后,强调一下,学习编程,不能只看书,要多敲代码。

责任编辑:赵宁宁 来源: strongerHuang
相关推荐

2023-11-15 13:15:52

C语言结构体

2023-12-01 07:38:33

微服务订单服务

2010-07-09 14:51:21

SQL Server

2021-06-06 22:22:32

c语言编程语言

2013-05-14 09:55:16

推广手游海外市场

2010-02-04 16:35:24

C++ delete

2022-08-19 14:38:52

C语言结构体struct

2020-11-16 11:24:00

Spring AOP数据库

2019-02-21 15:50:11

谷歌云云计算AWS

2021-09-21 15:56:00

iPhone 13苹果双十一

2019-12-11 14:46:34

库克苹果科技

2017-08-28 14:58:40

京东云计算OpenStack技术

2010-03-18 17:43:16

云计算

2022-06-17 18:49:25

pythonexcel

2015-06-29 14:23:13

JavaC++慢很多

2018-08-07 15:26:42

Linux版本系统

2010-06-22 12:58:57

Linux at命令

2016-08-31 13:48:00

AndroidRetrofit源码解析

2018-09-19 16:37:07

程序员工程师职场

2010-03-03 11:02:40

RedHat Linu
点赞
收藏

51CTO技术栈公众号