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

2024-06-08 1481阅读

结构体数组

    • 前言
    • 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  
        

        输出结果:

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

        分析:定义一个结构体数组 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;
        }
        

        输出结果:

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

        (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 name, p->score);
        	}
        	return 0;
        }
        

        输出结果:

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

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

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]