【C语言】结构体类型的数组和指针(干货满满,建议收藏!!!)

avatar
作者
筋斗云
阅读量:1

结构体数组

这篇文章将讲述结构体类型的数组的定义、初始化、应用和结构体指针的使用。还会扩展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; } 

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

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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!