【C语言】struct结构体内存对齐和位段(超详解)

【C语言】struct结构体(超详解)

前言:
本期开始详解结构体,由于文章过长,所以分了几篇文
包括结构体概念,结构体的内存对齐以及位段
若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持
谢谢大家 ! ! !

一、结构体是什么?

1.为什么有结构体

结构体是C语言中的自定义数据类型,用于描述现实中的复杂对象。而C语言单一内置类型如char、int、float等无法完整描述现实中的复杂对象。
例如:
在生活中描述一名在校学生,有姓名、性别、学号、班级、成绩等等,其中既有int整型,又有float浮点型,还有char字符型等等
此处的在校学生就是一个复杂对象,单一内置类型如char、int、float等无法完整描述该在校学生

2.结构体简介

结构体就是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。
姓名、性别、学号等就可以集合成一个结构体 。

3.结构体的声明

struct tag//结构体标签名
{
member - list;//成员变量列表
}variable - ist;//变量列表
tag : 结构体标签名(自定义)
struct tag :结构体类型
member - list : 成员变量列表(至少一个成员)
variable - ist : 可选的变量列表(可直接创建变量)

4.结构体的定义

这里我们定义一个结构体包含一名学生的姓名(name)、年龄(age)、成绩(score)
字符数组存储学生姓名
整型存储年龄
浮点型存储成绩

代码演示:
先定义结构体类型,再定义结构体变量

c 复制代码
struct student//结构体变量名
{
	char name[20];//姓名
	int age;//年龄
	float score;//成绩

}; //定义结构体类型

struct student S;//定义结构体变量

5.结构体变量的初始化

代码演示:

c 复制代码
struct student//结构体变量名
{
	char name[20];//姓名
	int age;//年龄
	float score;//成绩

}; //定义结构体类型

struct student S = { "xiaobai",18,88.8 };
//定义并初始化结构体变量

初始化后 xiaobai , 18 , 88.8 这些信息就被输入到结构体变量 S 中了

那么该怎么使用这个结构体变量呢?

6.结构体访问操作符( . )

  • 点操作符:( . )

通过点操作符我们可以对结构体成员进行访问
将成员一一拿出来

语法 :结构体变量名 . 结构体成员名
示例 :S . name 访问字符成员name

代码演示:

c 复制代码
#include <stdio.h>

struct student//结构体变量名
{
	char name[20];//姓名
	int age;//年龄
	float score;//成绩

}; //定义结构体类型

struct student S = { "xiaobai",18,88.8 };
//定义并初始化结构体变量

int main()
{

	printf("%s\n%d\n%f", S.name, S.age, S.score);
	//依次打印出结构体成员
	return 0;
}

运行结果:

6.结构体数组

我们说一个结构体可以表示一名学生的信息,但是如果我想要一整个班上人的信息呢,那又该怎么办?

这时候就要用到结构体数组
将多个同种类型的结构体变量整合到一起成一个数组
这就是结构体数组

代码演示:(这里只写了3名学生)

c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

struct student//结构体变量名
{
	char name[10];//姓名
	int age;//年龄
	float score;//成绩

}; //定义结构体类型

int main()
{
	int i;
	struct student S[3];
	//定义结构体数组
	for (i = 0; i < 3; i++)
	{
		scanf("%s %d %f", &S[i].name, &S[i].age, &S[i].score);
		//对结构体成员一一输入
	}
	printf("\n\n");
	for (i = 0; i < 3; i++)
	{
		printf("%s %d %.2f\n", S[i].name, S[i].age, S[i].score);
		//对结构体成员一一打印
	}
	return 0;
}

运行结果:
(输入和输出:)

这里要注意输入和输出时结构体数组的形式

7.结构体指针(最重要)

结构体指针就是指向结构体的指针 ,方式与定义与其他类型变量的指针类似。
语法: struct student * ps = &S ;
将结构体变量 S 的地址赋给指针 ps
这个 ps 就是结构体指针

代码演示:

c 复制代码
#include <stdio.h>

struct student//结构体变量名
{
	char name[20];//姓名
	int age;//年龄
	float score;//成绩

}; //定义结构体类型

struct student S = { "xiaobai",18,88.8 };
//定义并初始化结构体变量
struct student* ps = &S;
//将结构体变量 S 的地址赋给指针 ps
//ps的类型是struct student型

以上代码中
ps的类型为struct student型,是一个结构指针
表示着该结构体的地址

8.结构体访问操作符( -> )

上面我们学习了点操作符( . )
语法是 :结构体变量名 . 结构体成员名

而还存在一个结构体访问操作符( -> )
其语法是 :结构体指针 -> 成员名

和点操作符一样, -> 也可以用其对结构体成员进行访问

代码演示:

c 复制代码
#include <stdio.h>

struct student//结构体变量名
{
	char name[20];//姓名
	int age;//年龄
	float score;//成绩

}; //定义结构体类型

struct student S = { "xiaobai",18,88.8 };
//定义并初始化结构体变量
struct student* ps = &S;
//将结构体变量 S 的地址赋给指针 ps
//ps的类型是struct student型

int main()
{
	printf("%s\n%d\n%f\n\n", ps->name, ps->age, ps->score);
	//依次打印出结构体成员
	return 0;
}

运行结果:

可以说
S.name 与 ps -> name 完全等价
我们可以视情况对两个操作符进行使用

结语

本期资料来自于:
https://legacy.cplusplus.com/

OK,本期的结构体详解到这里就结束了
由于文章过长,所以分了几篇文
若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持
本文有若有不足之处,希望各位兄弟们能给出宝贵的意见。谢谢大家!!!
新人,本期制作不易希望各位兄弟们能动动小手,三连走一走!!!
支持一下(三连必回QwQ)

相关推荐
星辰落满衣几秒前
股票实时交易数据之Python、Java等多种主流语言实例代码演示通过股票数据接口
java·开发语言·python
困死了111111 分钟前
PostgreSQL笔记
数据库·笔记·postgresql
YJlio27 分钟前
ProcessExplorer_17.09_x64-Chs 新版本升级:我看到的区别与优势(含升级思路与注意点)
人工智能·笔记·学习
毕设源码-钟学长31 分钟前
【开题答辩全过程】以 基于java的点餐猫在线个性化点餐系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
淼淼76339 分钟前
Qt调度 程序
开发语言·c++·windows·qt
智算菩萨40 分钟前
【实战】使用讯飞星火API和Python构建一套文本摘要UI程序
开发语言·python·ui
A24207349301 小时前
JavaScript图表制作:从入门到精通
开发语言·javascript·信息可视化
不会聊天真君6471 小时前
CSS3(Web前端开发笔记第二期)
前端·笔记·css3
BD_Marathon1 小时前
Vue3_简介和快速体验
开发语言·javascript·ecmascript