【C语言】结构体类型的数组和指针(干货满满,建议收藏!!!)
创始人
2025-01-16 01:36:41
0

结构体数组

    • 前言
    • 1、结构体类型数组的定义与初始化
      • 1.1结构体数组的定义
      • 1.2结构体数组初始化
    • 2、结构体数组的应用
    • 3、结构体指针指向结构体数组

这篇文章将讲述结构体类型的数组的定义、初始化、应用和结构体指针的使用。还会扩展scanf_s函数相关知识。

前言

一个结构体变量中可以存放一组有关联的数据(如一个学生的学号、姓名、性别、成绩、地址等数据)。如果有 20个学生的数据需要处理,应该用数组,但是普通的数组显然不能处理怎么复杂的问题,这时就需要结构体类型的数组了。结构体数组与数值型数组的不同之处在于每个数组元素都是一个结构体类型的数据,结构体数组的每个元素都包含了结构体中的每个成员。

结构体基本知识:https://editor.csdn.net/md/?articleId=139336546

1、结构体类型数组的定义与初始化

1.1结构体数组的定义

方式一:struct 结构体类型名 数组名[数组大小];

//结构体声明 struct Student { 	char id[20];//学号 	char name[10]; 	int age; 	float score; };  int main() { 	struct Student class1[20];//定义结构体数组,表示班级1有20个学生 	return 0; } 

方式二:在声明结构体时定义一个结构体数组

struct Student { 	char id[20];//学号 	char name[10]; 	int age; 	float score; }class1[20];  int main() { 	return 0; } 

1.2结构体数组初始化

方式:struct Student class1[20] = { 初始值列表 };
如:struct Student class1[2] = { "20242356","小敏",18,88.9,"20242345","小鹤",19,85.9 };

//结构体声明 struct Student { 	char id[20];//学号 	char name[10]; 	int age; 	float score; };  int main() { 	//定义结构体数组并初始化,表示班级1有2个学生 	struct Student class1[2] = { "20242356","小敏",18,88.9,"20242345","小鹤",19,85.9 }; 	return 0; } 

2、结构体数组的应用

现在有 3 个候选人准备当选学生会部长,每个学生会成员只能投票选一人,有学生会有5个成员,先后输入被选人的名字,最后输出各人得票结果。

// 结构体声明 struct Student { 	char name[20]; 	int count; };  int main() { 	struct Student leader[2] = { "小明", 0, "小夏", 0 };	//初始化 	char leader_name[20];	//用来存放成员投票候选人的名字 	//成员输入自己要投的候选人 	printf("开始投票:\n"); 	for (int i = 0; i < 5; i++) 	{ 		scanf_s("%s", leader_name, 20); 		for (int j = 0; j < 2; j++) 		{ 			if (strcmp(leader_name, leader[j].name) == 0) 			{ 				leader[j].count++; 			} 		} 	} 	printf("投票结果:\n"); 	for (int i = 0; i < 2; i++) 	{ 		printf("%s:%d\n", leader[i].name, leader[i].count); 	} 	return 0; } 

输出结果:
在这里插入图片描述

分析:定义一个结构体数组 leader,它有2 个元素,每一个元素包含两个成员 name(候选人)和 count(票数)。在定义结构体数组时使之初始化,让两个候选人的票数为0。在主函数中定义字符数组 leader_name,用来存放成员选的被选人的姓名。在每次循环中输入一个被选人姓名,然后把它与结构体数组中2 个候选人姓名相比,看它和哪一个候选人的名字相同。相同的就票数+1,在输入和统计结束之后,将 2人的名字和得票数输出。
扩展:scanf_s()函数解析
形式:int scanf_s(const char *format, ...);
scanf_s是C和C ++编程语言中的格式化输入函数。它通常用于从标准输入流(通常是键盘)读取数据,并根据指定的格式将其存储在变量中。后缀_s代表“安全”,旨在帮助防止某些类型的安全漏洞,如缓冲区溢出。scanf_s函数类似于scanf,但它包括额外的参数,用于指定某些类型输入操作的最大字符数,例如对于字符串的%s。这有助于防止缓冲区溢出,即读取太多数据进入缓冲区并覆盖相邻内存的情况。
列如:上述代码中的scanf_s("%s", leader_name, 20);第三个参数指限定输入的字符串大小。20,表示只能输入19个字符,最后一个是“\0”。

3、结构体指针指向结构体数组

结构体指针的定义:
结构体指针就是指向结构体变量(或结构体数组)的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中,那么,这个指针变量就指向该结构体变量。
使用:
(1)指向结构体变量的结构体指针用法:

  1. (*p).成员名
  2. p->成员名

代码展示:

struct Student { 	char name[20]; 	float score; }; int main() { 	struct  Student s1 = { "小新",89.5 }; 	struct Student* p = &s1; 	printf("name:%s score:%.1f\n",p->name, p->score); 	printf("name:%s score:%.1f\n",(*p).name, (*p).score); 	return 0; } 

输出结果:
在这里插入图片描述

(2)指向结构体数组的指针:
有 3 个学生的成绩,放在结构体数组中,要求输出全部学生的成绩。

struct Student { 	char name[20]; 	float score; };  int main() { 	//定义结构体数组并初始化 	struct Student stu[3] = { {"Li Ming" ,88.5},{"Zhang San" ,78.5},{"Wang Wu",91.5} }; 	//定义指向struct Student结构体变量的指针变量 	struct Student* p; 	for (p = stu; p < stu + 3; p++) 	{ 		printf("%-10s: %.1f\n", p->name, p->score); 	} 	return 0; } 

输出结果:
在这里插入图片描述
总结: 结构体类型的数组是为处理现实生活中复杂的问题,让复杂的问题更加简单和高效,如在处理群众选举候选人,学生成绩的录入等等。

那么写到这里,本节内容就结束了,这篇博客花费了很长时间,但写完有满满的成就感,希望能帮助到大家,如果文章有不足的地方,欢迎在评论区留言指正,我们一起学习交流! 希望能得到大家的关注、点赞、评论、收藏! 你的支持是我最大的动力!!

相关内容

热门资讯

突发!wepoker买钻石有用... 突发!wepoker买钻石有用吗,德扑之心免费透视,好像真的有挂(有挂教学)1)德扑之心免费透视免费...
相较于以往!wepoker私人... 相较于以往!wepoker私人局外卦,德普之星透视辅助,本来是真的有挂(有挂功能);1)德普之星透视...
长期以来!购买wepoker模... 长期以来!购买wepoker模拟器,德扑之心免费透视,一贯真的是有挂(竟然有挂)1、完成德扑之心免费...
这一问题亟待解决!wepoke... 这一问题亟待解决!wepoker轻量版有透视吗,如何下载德普之星辅助软件,本来确实有挂(有挂方针)1...
有消息称!wpk私人辅助,如何... 有消息称!wpk私人辅助,如何下载德普之星辅助软件,确实是真的有挂(有挂细节)1、如何下载德普之星辅...
技巧辅助挂!wepoker有辅... 技巧辅助挂!wepoker有辅助功能吗,德扑之星透视,切实真的有挂(有挂技巧)1、德扑之星透视辅助器...
为了进一步!hhpoker德州... 为了进一步!hhpoker德州机器人,德普之星辅助器,真是确实有挂(有挂技术)1、实时德普之星辅助器...
截至发稿!wpk真的有透视嘛,... 截至发稿!wpk真的有透视嘛,德普之星怎么开辅助,其实是有挂(有挂解惑)1、用户打开应用后不用登录就...
技巧辅助挂!xpoker辅助神... 技巧辅助挂!xpoker辅助神器,德扑软件,一贯存在有挂(真的有挂)1、进入到德扑软件是否有挂之后,...
受玩家影响!wepoker私人... 受玩家影响!wepoker私人辅助器,智星菠萝可以辅助吗,原来是真的有挂(有挂工具)小薇(辅助器软件...