【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)

相关推荐
J2虾虾2 分钟前
Java使用的可以使用的脚本执行引擎
java·开发语言·脚本执行
计算机小手5 分钟前
Docker 部署 weserv-images:打造非侵入式图片处理中间件
图像处理·经验分享·docker·中间件
幻云20105 分钟前
Next.js指南:从入门到精通
开发语言·javascript·人工智能·python·架构
老马识途2.07 分钟前
java处理接口返回的json数据步骤 包括重试处理,异常抛出,日志打印,注意事项
java·开发语言
CCPC不拿奖不改名13 分钟前
网络与API:从HTTP协议视角理解网络分层原理+面试习题
开发语言·网络·python·网络协议·学习·http·面试
三流架构师17 分钟前
高中地理资源合集
经验分享
代码游侠22 分钟前
学习笔记——HC-SR04 超声波测距传感器
开发语言·笔记·嵌入式硬件·学习
superman超哥34 分钟前
Context与任务上下文传递:Rust异步编程的信息高速公路
开发语言·rust·编程语言·context与任务上下文传递·rust异步编程
步达硬件35 分钟前
【Matlab】批量自定义图像处理
开发语言·matlab
军军君0137 分钟前
Three.js基础功能学习七:加载器与管理器
开发语言·前端·javascript·学习·3d·threejs·三维