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

相关推荐
猷咪2 小时前
C++基础
开发语言·c++
IT·小灰灰2 小时前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧2 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q2 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳02 小时前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾2 小时前
php 对接deepseek
android·开发语言·php
2601_949868362 小时前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
ling___xi2 小时前
《计算机网络》计网3小时期末速成课各版本教程都可用谢稀仁湖科大版都可用_哔哩哔哩_bilibili(笔记)
网络·笔记·计算机网络
飞机和胖和黄2 小时前
考研之王道C语言第三周
c语言·数据结构·考研
星火开发设计2 小时前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识