02 结构体
一、结构体
1、结构体的声明与定义
- (1)先声明结构体变量,再定义该类型变量
struct Student{
int num;
char name[20];
};
struct Student SU;//定义结构体变量SU
*(2)声明类型的同时定义变量
struct Student{
int num;
char name[20];
}student1,student2;
2、结构体变量的初始化和引用
(1)在定义结构体变量时可以对它初始化
struct Student{
int num;
char name[20];
char sex;
char age;
char addr[30];
}student1={10001,"Li Lin",'M',22,"Beijing Road"};
struct Student student2={.name="Zhang Fang"};//C99标准允许对某一成员初始化
(2)结构体成员的引用
结构体变量的地址主要作函数参数,传递结构体变量的地址。
student1.成员名表示访问结构体的成员。
//结构体变量访问成员
student1.count=100;
student1.name="ZhangSan";
//结构体指针访问成员
su->count=90;
su->name="LiSi";
3、结构体嵌套
//声明一个结构体类型struct Date
struct Date{
int year; //年
int month; //月
int day; //日
};
//声明一个结构体类型struct Student
struct Student{
int num;
char name[20];
char sex;
char age;
struct Date Birthday;
char addr[30];
};
结构体大小,需注意字节对齐:

4、结构体数组
结构体数组每个数组元素都是一个结构体类型的数据,它们分别包括各个成员项。
选举投票统计为例:
#include <stdio.h>
#include <string.h>
//声明一个struct Person结构体类型并定义一个结构体数组
struct Person{
char name[20]; //候选人姓名
int count; //候选人票数
}leader[3]={"Li",0,"Zhang",0,"Sun",0};
int main()
{
int i,j;
char leader_name[20];//定义字符数组存储被投票人名字
for(i=1;i<=10;i++)
{
scanf("%s",leader_name);
for(j=0;j<3;j++)
{
if(strcmp(leader_name,leader[j].name) == 0)
{
leader[j].count++;
}
else printf("%s 不是候选人 \n",leader_name);
}
}
printf("result:\n");
for(i=0;i<3;i++)
{
printf("%5s: %d\n",leader[i].name,leader[i].count++);
}
}

5、结构体指针
一个结构体变量的起始地址就是这个结构体变量的指针。
指向结构体对象的指针变量既可指向结构体变量,也可指向结构体数组中的元素,指针变量的基类必须与结构体变量的类型相同。
(1)指向结构体变量的指针
struct Student *su;,定义结构体指针变量su,su可以指向struct Student类型的变量或数组元素。
su->成员名等价于(*su).成员名,括号不可省,运算符“.”优先于“*”。
#include <stdio.h>
#include <string.h>
//声明一个结构体类型struct Student
struct Student{
long num;
float score;
char name[20];
char sex;
};
struct Student SU; //定义struct Student类型变量SU
struct Student *su; //定义struct Student类型指针变量su
int main()
{
su=&SU; //结构体指针su指向结构体变量SU
SU.num=10000;//对结构体成员变量赋值
strcpy(SU.name,"Li Lin"); //用字符串复制函数给SU.name赋值
SU.sex='M';
SU.score=90.5;
printf("No:%ld\nname:%s\nsex:%c\nscore:%5.2lf\n\n",SU.num,SU.name,SU.sex, SU.score);
printf("No:%ld\nname:%s\nsex:%c\nscore:%5.2lf\n",(*su).num,(*su).name,(*su).sex,(*su).score);
return 0;
}

(2)指向结构体数组的指针
- 有三个学生信息,放在结构体数组中,输出全部学生信息:
a.声明结构体类型struct Student,并定义结构体数组,同时初始化;
b.定义一个指向struct Student类型数据的指针变量su;
c.使su指向结构体数组的首元素,输出它指向的元素中的有关信息;
d.使su指向结构体数组下一个元素,输出它指向的元素中的有关信息;
e.再使su指向结构体数组下一个元素,输出它指向的元素中的有关信息;
#include <stdio.h>
#include <string.h>
//声明一个结构体类型struct Student 32字节
struct Student{
int num;
char name[20];
char sex;
int age;
};
struct Student STU[3]={{10001,"Li Lin",'M',18},{10002,"Zhang Shan",'M',20},{10003,"Wang Min",'F',21}};//定义结构体数组并初始化
struct Student *su; //定义struct Student类型指针变量su
int main()
{
printf("No Name sex age\n");
for (su=STU;su<STU+3;su++)//循环遍历结构体地址
{
printf("%5d %-16s%-2c %-2d\n",su->num,su->name,su->sex,su->age);
}
return 0;
}


6、结构体变量和结构体变量的指针作函数参数
将一个结构体变量的值传递给另一个函数有3个方法:
a.用结构体变量的成员作参数;
b.用结构体变量作参数;
c.用指向结构体变量(或数组元素)的指针作实参。
有N个结构体变量,内含学生学号、姓名和3门课程成绩,要求输出成绩最高的学生的信息,包括学号、姓名、3门课程成绩和平均成绩。
思路:将N个学生的数据表示为结构体数组,封装三个函数。
input函数输入数据和求学生平均成绩;
max函数找平均成绩最高的学生;
print函数输出成绩最高学生的信息。
主函数中先后调用这三个函数,用指向结构体变量的指针作实参。
#include <stdio.h>
#define N 3 //学生数量
//声明一个结构体类型struct Student
struct Student{
int num; //学号
double score[3]; //3门课平均成绩
float aver; //平均成绩
char name[20]; //姓名
};
//函数声明
void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stu);
int main()
{
//定义结构体数组和指针
struct Student stu[N];
struct Student *su;
su=stu;
input(su);
print(max(su));
return 0;
}
void input(struct Student stu[])
{
int i;
printf("请输入各学生的的信息:学号 姓名 3门课程成绩\n");
for(i=0;i<N;i++)
{
scanf("%d %s %lf %lf %lf",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);//输入数据
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0; //求平均成绩
}
}
struct Student max(struct Student stu[])
{
int i,m=0; //m存放成绩最高的学生在数组中的序号
for(i=0;i<N;i++)
{
if(stu[i].aver>stu[m].aver) //找出平均成绩最高的学生在数组中的序号
{
m=i;
}
}
return stu[m];
}
void print(struct Student stu)
{
printf("\n成绩最高的学生是:\n");
printf("学号:%d\n姓名:%s\n3门课成绩:%5.1f %5.1f %5.1f\n平均成绩:%6.2f\n",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.aver);
}


浙公网安备 33010602011771号