当前位置:网站首页>一文读懂C语言中的结构体
一文读懂C语言中的结构体
2022-07-01 18:46:00 【嵌入式悦翔园】
1、什么是结构体
结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又有关系的若干数据。其关键字为struct。
2、结构体的声明
我们通过关键字struct对结构体进行声明,具体格式如下:
struct book
{
char title[100];
char author[100];
char date[100];
}
我们通过上面的语句定义出了一本书的三个属性,分别是title
author
date
,且格式为char
型(字符型)
注意:
声明时也可以不完全声明,比如省略结构体标签。
3、结构体的引用
定义了结构体变量之后就可以在程序中对他进行引用,但是结构体变量的引用同一般变量引用不太一样,因为结构体变量中有多个不同类型变量,所以结构体变量不能整体引用,只能一个一个成员的引用。
1、只能分别单独引用他内部的成员。
//结构体变量名.成员名
book.title = "三国演义";
book.author = "罗贯中";
book.date = "2006";
2、如果结构体类型中的成员也是一个结构体类型,则要使用若干个"."
,一级一级的找下去。因为只能对最低级的成员进行操作。其实结构体就是对数据的一种封装,当结构体成员也是结构体时,完全可以将结构体成员释放出来。
封装前:
struct age
{
int year;
int month;
int day;
}
struct student
{
char name[20];
int num;
struct age birthday;
float score;
}
封装后:
struct student
{
char name[20];
int num;
int year;
int month;
int day;
float score;
}
3、可以引用结构体变量
成员的地址
,也可以引用结构体变量
的地址。如&student1.num
和 &student1
,前者标志student1.num
这个成员在内存中的首地址,后者表示结构体变量student1在内存中的首地址。
在C语言中,结构体变量的首地址就是结构体第一个成员的首地址。所以&student1
就等价于第一个成员name的首地址,而name
是一个数组,数组名表示的就是数组的首地址。但是要注意的是,他们等价于他们表示的是同一个内存空间的地址
,但他们的类型是不同的。
4、结构体作用
1、结构体和其他类型基础数据类型一样,例如int类型、char类型,只不过结构体可以做成你想要的数据类型,以方便日后的使用。
2、结构体指针作函数入口参数,提高程序的可扩展性。
5、结构体的大小与内存对齐
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit
字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。
所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。
在每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16
来改变这一系数,其中的n就是你要指定的“对齐系数”。
6、结构体对齐规则
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
边栏推荐
- AAAI2020: Real-time Scene Text Detection with Differentiable Binarization
- ffmpeg 错误码
- SIP protocol of gb28181
- nacos启动失败问题解决与总结
- Bao, what if the O & M 100+ server is a headache? Use Xingyun housekeeper!
- 利用win7漏洞进行系统登录密码破解
- ES6中的代理proxy
- Les canaux de culture intensive s'efforcent de développer Fu Xin et Wei Shi jiajie pour organiser une conférence de formation sur les nouveaux produits
- 数字化转型企业成功的关键,用数据创造价值
- Ubuntu14 install MySQL and configure root account local and remote access
猜你喜欢
uni-app微信小程序一键登录获取权限功能
118. Yanghui triangle
Why has instagram changed from a content sharing platform to a marketing tool? How do independent sellers use this tool?
AAAI2020: Real-time Scene Text Detection with Differentiable Binarization
DDR4 test-2
论文阅读【Discriminative Latent Semantic Graph for Video Captioning】
任务:拒绝服务DoS
[Mori city] random talk on GIS data (I)
JVM内存模型
Test self-study people must see: how to find test items in software testing?
随机推荐
Salesmartly has some tricks for Facebook chat!
精耕渠道共謀發展 福昕攜手偉仕佳傑開展新產品培訓大會
What must be done in graduation season before going to Shanhai
Solidity - contract structure - error - ^0.8.4 NEW
GB28181的NAT穿透
Analysis of GetMessage underlying mechanism
Brpc understanding
torch. nn. functional. Interpolate function
P2433 【深基1-2】小学数学 N 合一
703. 数据流中的第 K 大元素
物联网平台thingsboard搭建学习记录
【sql优化】with as 和 临时表的区别
Introduction to relevant processes and functions of wechat official account development
After studying 11 kinds of real-time chat software, I found that they all have these functions
Ubuntu14 install MySQL and configure root account local and remote access
axure不显示元件库
论文阅读【Discriminative Latent Semantic Graph for Video Captioning】
torch.nn.functional.interpolate函数
Learning notes [Gumbel softmax]
JVM内存模型