一. 前言
相信大家在刚接触到结构体这一章节时,内心都是很茫然的,什么是结构体呢?结构体的具体用途是什么呢?今天这篇文章就给大家解决这些问题!!!
二. 什么是结构体
结构体是C语言中一种自定义的复合数据类型,它允许我们将不同类型的数据组合在一起形成一个新的数据类型。
这里给大家举一个例子:
一个学生有自己的姓名、性别、年龄、学号
这里把 学生 做为一个结构体,姓名、性别、年龄、学号做为结构体内部的各种类型
1. 基本特点
- 可以包含多个不同的类型的数据成员
- 将描述的实体各种属性结合在一起
- 在内存中是连续存储的
2. 基本语法
struct 结构体标签
{
数据类型 成员1;
数据类型 成员2;
数据类型 成员3;
...
};
struct Stu
{
char name[20];//姓名
char sex[5];//性别
int age;//年龄
char id[15];//学号
};
3.变量的声明
- 单独声明
struct Student Stu //声明了一个Student类型的变量
struct Point pt1, pt2; //声明了多个Point类型的变量
- 定义时同时声明
struct Person
{
char name[20];
char sex[5];
int age;
}Per1, Per2;//同时声明两个Person类型的变量
- 使用typedef简化
typedef struct
{
char name[20];
char sex[5];
int age;
}Person;//现在可以直接用Person声明变量
Person p1,p2;//不需要写struct关键字了
注意:
1.在结构体中不能包含一个类型为该结构本身的成员,因为一个结构体中在包含一个同类型的结构体变量,这样结构体的变量就会变的无穷大。
struct Node
{
int data;
struct Node next;
};
正确做法:
struct Node
{
int data;
struct Node* next;
};
2.在使用typedef时如果是匿名结构体,就不能在结构体内部提前使用Node类型来创建成员变量。
typedef struct
{
int data;
Node* next;
}Node;
正确做法:
typedef struct Node
{
int data;
Node* next;
}Node;
4. 结构体成员的访问
结构体成员的访问使用点运算符(.)或箭头运算符(->);
- 直接访问(使用点运算符)
typedef struct
{
char name[20];//姓名
char sex[5];//性别
int age;//年龄
char id[15];//学号
}Stu;
int main()
{
Stu s = { "张三","男",20,"000001" };
printf("姓名:%s\n", s.name);
printf("性别:%s\n", s.sex);
printf("年龄:%d\n", s.age);
printf("学号:%s\n", s.id);
return 0;
}
- 通过指针访问(使用箭头运算符)
typedef struct
{
char name[20];//姓名
char sex[5];//性别
int age;//年龄
char id[15];//学号
}Stu;
int main()
{
Stu s = { "张三","男",20,"000001" };
Stu* p = &s;
strcpy(p->name, "李四");
p->age = 21;
printf("%s\n", p->name);
printf("%s\n", p->sex);
printf("%d\n", p->age);
printf("%s\n", p->id);
return 0;
}
三. 结构体的内存布局
前面介绍了结构体的使用方法·,相信大家也对结构体有了一定的了解,接下来我们学习一下结构体在内存是怎样分布的。
结构体的内存对齐
结构体的内存大小是如何计算的呢?
struct S
{
char c1;
int i;
char c2;
}
上述代码的内存大小为多少?
char为1个字节,int为4个字节。char + int + char = 6个字节。
结果真的是6个字节吗?
正确答案是12个字节
内存对齐规则:
- 每个成员必须从对齐数的整数倍地址开始存放
- 必须是最大成员对齐的整数倍
- 嵌套的结构体对齐到其自身最大对齐数
struct S
{
char c1; //1字节,偏移0
int i; //4字节,偏移4(需要从4的倍数开始)
char c2; //1字节,偏移8
//总大小:为12个字节
}
- 为什么存在内存对齐
- 平台原因:
不是所有的平台都能访问任意地址上是任意数据。只能在某些地址取某些特定类型的数据。 - 性能原因:
对齐的内存减少访问次数,从而提高性能。
建议:
按对齐数从小到大排列成员,减少填充空间的浪费
往期回顾:
【数据结构】——时间与空间复杂度深度解析
力扣(LeetCode) ——轮转数组(C语言)
总结
以上就是博主对结构体的讲解了,希望对大家有一定的帮助,学习的路途中一定是痛苦的,我们要努力坚持,每天进步一点点。不积硅步,无以至千里。不积小流,无以成江海。
文章中如果有哪里不对或者没讲解到的地方都可以在评论区评论或者私信博主,最后也感谢大家点赞、评论、收藏和关注
转载自CSDN-专业IT技术社区