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

相关推荐
_不会dp不改名_1 小时前
HCIP笔记6--OSPF域外路由、特殊区域(stub、totally stub)
笔记·hcip
MC皮蛋侠客1 小时前
C++17多线程编程全面指南
开发语言·c++
郝学胜-神的一滴1 小时前
Linux C++系统编程:使用mmap创建匿名映射区
linux·服务器·开发语言·c++·程序人生
摇滚侠1 小时前
零基础小白自学Git_Github教程,创建自己的第一个 GitHub 仓库,笔记06
笔记·git·github
新手村领路人1 小时前
c++ opencv缺少openh264-1.8.0-win64.dll
开发语言·c++
周杰伦fans1 小时前
C# - 直接使用 new HttpClient() 和使用 HttpClientFactory 的区别
开发语言·c#
kyle~1 小时前
C++ --- noexcept关键字 明确函数不抛出任何异常
java·开发语言·c++
不知所云,1 小时前
6. c++ 20 Modules 使用
开发语言·c++20·c++ modules
沐浴露z1 小时前
详解Java ArrayList
java·开发语言·哈希算法