C语言:结构体

结构体是一些值的集合,这些值被称为成员变量,结构体的每个成员可以是不同类型的变量

目录

1.结构体类型的声明

c 复制代码
struct tag{
	number-list;
}variable-list;

例如描述一个学生

c 复制代码
struct Stu {
	int ID;
	char name[20];
	int age;
	char sex[5];
};

结构体的初始化

c 复制代码
struct Stu {
	int ID;
	char name[20];
	int age;
	char sex[5];
};
int main() {
	struct Stu s = { 2022105101, "fengjiarui", 21, "man" };//按顺序初始化
	printf("%d ", s.ID);
	printf("%s ", s.name);
	printf("%d ", s.age);
	printf("%s", s.sex);

	printf("\n");

	struct Stu s2 = { .age = 18, .ID = 2022105110, .name = "sudhauhduas", .sex = "man" };//不按顺序初始化
	printf("%d ", s2.ID);
	printf("%s ", s2.name);
	printf("%d ", s2.age);
	printf("%s", s2.sex);

	return 0;
}

2.结构体的特殊声明

在结构体声明的时候可以不完全声明

比如:

c 复制代码
struct {
	int ID;
	char name[20];
	int age;
	char sex[5];
}x;

上述的结构体在声明的时候省略了结构体标签(tag)被称为匿名结构体

上述结构体一般情况下只能使用一次,因为可以直接在大括号外面定义一些变量,这些变量可以使用结构体中的数据,

而在主函数中就不能通过结构体定义变量了所以说匿名结构体只能使用一次。

3.结构体的自引用

可以在结构体中包含一个结构体,该种方式叫做结构体的自引用。

c 复制代码
typedef struct {
	int year;
	int month;
	int day;
} Birthday;
typedef struct {
	int id;
	char* name;
	float scroe;
	int age;
	Birthday bir;
}Student;

上述代码在student中包含了birthday结构体

typedef的作用是给结构体的类型重命名,

在初始化时我们一般使用:

c 复制代码
	struct Stu s = { 2022105101, "fengjiarui", 21, "man" };

而加上typedef之后就可以这样初始化:

c 复制代码
	student s = { 2022105101, "fengjiarui", 21, "man" };

不用再写struct了。

c 复制代码
typedef struct {
	int year;
	int month;
	int day;
} Birthday;
typedef struct {
	int id;
	char* name;
	float scroe;
	int age;
	Birthday bir;
}Student;
int main() {
	Student stu1 = { 2022105101, "feng", 100.0, 21, {2003, 3, 5} };
	printf("id:%d name:%s score:%.2f age:%d birthday:%d-%d-%d", stu1.id, stu1.name, stu1.scroe, stu1.age, stu1.bir.year, stu1.bir.month,stu1.bir.day);

	return 0;
}

5.结构体在内存中的存储(对齐规则)

对齐规则:

1.结构体的第一个成员对齐到结构体变量起始位置偏移量为0的地址处

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处

3.结构体的总大小为最大对齐数(所有成员中最大的对齐数)的整数倍

4.如果嵌套了结构体,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍。

5.对齐数 = 编译器默认的一个对齐数与该成员变量的大小的较小值。

vs中默认是8.

比如计算下列结构体的字节数:

c 复制代码
struct s1{
	char c1;
	int i;
	char c2;
};

解析:

6.结构体传参

c 复制代码
#include<stdio.h>
struct s1{
	char c1;
	int i;
	char c2;
};

struct s1 s = { 'a', 10, 'b' };

void print1(struct s1 s) {
	printf("%c\n", s.c1);
}

void print2(struct s1* s) {
	printf("%d\n", s->i);
}
int main() {
	print1(s);
	print2(&s);
}

在使用结构体传参时最好使用指针,因为:

  • 函数传参时,参数需要压栈,会有时间和空间上的系统开销
  • 如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销过大,所以会导致性能的下降
  • 用指针访问结构体成员时用 ->
  • 用变量访问结构体成员时用 .

/考研势在必行/

相关推荐
唐维康几秒前
2027昆明理工大学机械考研分析:机械工程专硕157人占六成
考研·昆明理工大学
AC赳赳老秦1 分钟前
公开音频转写信息提取:OpenClaw 处理发布会与听证会文本并提取核心决策信息
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
@yanyu66614 分钟前
C编译器安装与第一个C程序
c语言·开发语言
落魄实习生26 分钟前
Agent Scope Java 2.x 系列【2】 ReActAgent
java·开发语言
山下梅子酒22532 分钟前
洛谷-入门-B2070
c语言
智鸟科技GemeOpen开发者智能设备35 分钟前
智能插座二次开发如何接入Home Assistant,从零开始完整工程实现(Python+React)
开发语言·python·物联网·react.js·智能家居
疯狂成瘾者37 分钟前
海康 Artemis 接口对接
开发语言·lua
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出多任务下载器中的“独特下载速度“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
2601_962218611 小时前
C++中decltype关键字的实现
开发语言·c++
hqyjzsb1 小时前
法律 Prompt 干货:搭建合同审查提示词要包含哪些要素
开发语言·人工智能·python·职场和发展·数据分析·prompt·业界资讯