结构体:结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合。
ⅰ复合性:结构体单元可以储存不同数据类型。
ⅱ是一种自定义类型。
ⅲ使用:定义类型——>通过类型分配结构体单元——>使用单元。
1)声明机构体类型:
struct 结构体名{
数据类型 成员1;
数据类型 成员2;
.....
};
说明:①该定义为类型定义。如:int x;
②类型名:struct 结构体名
例:struct stu{
int x;
double y;
char z;
};
机构体名:struct stu
大小:sizeof(struct stu);其大小不为4+8+1
说明:空类型的实例中不包括任何信息,本来求sizeof应该为0,但,声明该类型的实例的时候,它必须在内存中占一定的空间,否则无法使用这些实例,至于占多少内存由编译器决定。
2)通过类型声明变量
struct 机构体名 变量;
______类型______
例:struct stu s1,s2;
3)通过机构体变量,引用其成员
方法:结构体变量名.成员
"."成员运算符------>优先级同:[](最高)
例:S1.X=3
S1.y=5.7
S1.z='A'
S1=3
例:将机构体变量S1每一个分量赋值给机构体变量S2
S2.x=S1.x
S2.y=S1.y
S2.z=S1.z
若两者类型匹配,则两者可以直接赋值,即S2=S1
4)声明结构体指针变量,指向机构体变量
struct 结构体名 *指针变量;
例:struct stu *p
ⅰ.指针变量有指向
指针变量=&结构体变量
例: p=&S1
ⅱ.通过指针引用结构体成员
指针变量->成员名
例:struct stu S1
struct stu *p
p=&S1
S1.x=3
S1.y=5.7
S1.z='A' p->z='A'
证明:S1.x==>*&S1.x
==>*p.x
==>p->x
指针->成员==(*指针).成员
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
5)结构体数组的定义
struct 结构体名 数组名[个数];
例:struct stu S[5];
6)例:设学生信息 学号,姓名,数学成绩,英语成绩,语文成绩,通过键盘输入每个学生信息。
#include<stdio.h>
#include<string.h>
#define N 2
struct stu{
int id;
char name[20];
int math;
int English;
int Chi;
};
int main(void)
{
struct stu s[N];
double sumM=0,sumE=0,sumC=0;
for(int i=0;i<N;i++)
{
s[i].id=i+1;
printf("输入第%d位学生姓名:",i+1);
fflush(stdin);
gets(s[i].name);
printf("输入第%d位学生三门成绩:",i+1);
scanf("%d%d%d",&s[i].math,&s[i].English,&s[i].Chi);
}
Average(s,&sumM,&sumE,&sumC);
printf("%.2f %.2f %.2f",sumM,sumE,sumC);
return 0;
}
ⅰ.求个门成绩的总分
void Average(struct stu s[],double *sumM,double *sumE,double *sumC)
{
for(int i=0;i<N;i++)
{
(*sumM)+=s[i].math;
(*sumE)+=s[i].English;
(*sumC)+=s[i].Chi;
}
}