C语言-13-结构体类型

本文详细介绍了C语言中的结构体类型,包括如何定义和使用结构体变量,如何操作结构体数组,以及结构体指针的运用。通过学习,读者将能深入理解C语言中的结构体概念及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体类型

1.定义和使用结构体变量

/*
一.定义和使用结构体变量
1.自己建立结构体类型:用户自己建立不同类型数据组成的组合型的数据结构称为结构体
>>声明结构体类型的一般形式:
struct 结构体名
{成员列表};
>>可设计多种结构体类型;成员可以属于另一个结构体类型
2.定义结构体变量
>>先声明结构体类型再定义该类型变量
声明结构体类型struct Student,可以用它来定义变量
struct Student(结构体类型名) student1,student2(结构体变量名);
在声明类型的同时定义变量
不指定类型名而直接定义结构体类型变量
struct(指定了一个无名的结构体类型)
{成员表列}变量名表列;
3.结构体变量的初始化和引用
编程:把一个学生的信息(包括学号,姓名,性别,住址)放在一个结构体变量中,然后输出这个学生的信息
解题思路:自己建立一个结构体类型,包括有关学生信息的各成员;用它定义结构体变量,同时赋予初值;输出该结构体变量的各成员
*/
#include <stdio.h>

struct date
{
	int year; 
	int mouth; 
	int day;
};
struct student
{
	int inum;
	char cname[10];
	struct date birthday;//通过使用结构体定义结构变量(结构体变量作为结构体成员)
	double score;
}st3= { 103,"王五",{1779,12,29},98 },st4= { 104,"三毛",{1992,12,29},98 };

struct student st1 = { 101,"张三",{2020,12,29},98 }, st2= { 102,"李四",{1989,12,29},99 };

int main()
{
	printf("No.1:%d %s %d-%d-%d %.1lf\n", st1.inum, st1.cname, st1.birthday, st1.score);
	printf("No.2:%d %s %d-%d-%d %.1lf\n", st2.inum, st2.cname, st2.birthday, st2.score);
	printf("No.3:%d %s %d-%d-%d %.1lf\n", st3.inum, st3.cname, st3.birthday, st3.score);
	printf("No.4:%d %s %d-%d-%d %.1lf\n", st4.inum, st4.cname, st4.birthday, st4.score);
	return 0;
}

2.使用结构体数组

/*
使用结构体数组
1.定义结构体数组
(1)定义结构体数组的一般形式
struct 结构体名
{成员表列}数组名[数组长度];
(2)先声明结构体类型,再用此类型定义结构体数组
结构体类型 数组名[数组长度];struct Person leader[3]
对结构体数组初始化:在定义数组后面加上:={初值表列};struct Person leader[3]={"li",0,"zhang",0,"fun",0};
编程:有3各候选人,每个选民只能投1票,要求编一个统计选票的程序,先后输入被选入的名字,最后输出个人得票结果
思路:设计一个结构体数组,数组中包括3个元素;
每个元素中信息包括候选人姓名(字符型)和得票数(整型);
输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成员值加1
输出所有元素的信息
*/
//改造结构体变量
#include <stdio.h>

struct date
{
	int year;
	int mouth;
	int day;
};
struct student
{
	int inum;
	char cname[10];
	struct date birthday;//通过使用结构体定义结构变量(结构体变量作为结构体成员)
	double score;
}st[4]={ { 103,"王五",{1779,12,29},98 },
	{ 104,"三毛",{1992,12,29},98 },
	{ 101,"张三",{2020,12,29},98 },
	{ 102,"李四",{1989,12,29},99 }
};

int main()
{
	for(int i=0;i<4;i++)
		printf("No.%d: %d %s %d-%d-%d %.1lf\n", i + 1, st[i].inum, st[i].cname, st[i].birthday, st[i].score);
	
	return 0;
}


#include <stdio.h>

struct PersonS
{
	char name[20];
	int iCount;
}leader[3] = { {"li",0},{"zhang",0},{"wang",0} };

int main()
{
	char lname[20];//投票人输入姓名存放在lname
	for (int i = 1; i <= 10; i++)
	{
		printf("请输入候选人的姓名(li zhang wang):");
		scanf_s("%s", lname, 20);

		for (int j = 0; j < 3; j++)
		{
			if (strcmp(lname, leader[j].name) == 0)
				leader[j].iCount++;
		}
	}
	for (int i = 0; i < 3; i++)
	{
		printf("候选人%s:%d票\n", leader[i].name, leader[i].iCount);
	}
	printf("\n\n");
	return 0;
}

3.结构体指针

/*
结构体指针
1.指向结构体变量的指针
2.指向结构体数组的指针
struct Student *pt
如果p指向一个结构体变量stu,以下等价:
(*p).num = p>-num = stu.num

编程:有3个学生的信息,放在结构体数组中,要求输出全部学生的信息
思路:用指向结构体变量的指针处理
(1)声明struct Student,并定义结构体数组,初始化
(2)定义指向struct Student类型指针p
(3)使p指向数组首元素,输出元素中各信息
(4)使p指向下一个元素,输出元素中各信息
(5)再使p指向结构体数组的下一各元素,输出它指向的元素中的有关信息
3.用结构体变量和结构体变量指针作函数参数
(1)用结构体变量的成员作参数:stu[1].num或stu[2].name作函数实参
(2)用结构体变量作实参
(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参
*/
#include <stdio.h>

struct date
{
	int year;
	int mouth;
	int day;
};
struct student
{
	int inum;
	char cname[10];
	struct date birthday;//通过使用结构体定义结构变量(结构体变量作为结构体成员)
	double score;
}st[4] = { { 103,"王五",{1779,12,29},98 },
	{ 104,"三毛",{1992,12,29},98 },
	{ 101,"张三",{2020,12,29},98 },
	{ 102,"李四",{1989,12,29},99 }
};

int main()
{
	struct student *ps = st;

	printf("\n【结构体数组输出学生信息】\n");
	for (int i = 0; i < 4; i++)
		printf("No.%d: %d %s %d-%d-%d %.1lf\n", i + 1, st[i].inum, st[i].cname, st[i].birthday, st[i].score);

	printf("\n\n【结构体指针第一种形式输出学生信息】\n");
	for (int i = 0; i < 4; i++)
		printf("No.%d: %d %s %d-%d-%d %.1lf\n", i + 1, (*(ps + i)).inum, (*(ps + i)).cname, (*(ps + i)).birthday, (*(ps + i)).score);

	printf("\n\n【结构体指针第二种形式输出学生信息】\n");
	for (int i = 0; i < 4; i++)
		printf("No.%d: %d %s %d-%d-%d %.1lf\n", i + 1, (ps + i)->inum, (ps + i)->cname, (ps + i)->birthday, (ps + i)->score);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值