目录
1.为什么需要结构体
在日常生活中,我们经常会遇到很多较复杂的事情,例如一个班级需要统计期中考试成绩,成绩表中包含,每个同学的姓名,班级,学号,各科成绩以及总分。
姓名 | 班级 | 学号 | 语文 | 英语 | 数学 | 总分 |
LiHua | 1 | 123 | 100 | 90 | 80 | 270 |
LiMing | 1 | 124 | 90 | 90 | 80 | 260 |
每名同学对应相应的班级、学号、成绩,若一名同学的总分分数发生变化,他在班级的排名就会发生变化,此时改行的数据要一起移动到新的一行。我们发现如果用之前学过的知识好像难以实现这种操作,那么这时候我们就需要用到结构体了。
2.定义结构体
※※要注意{}后面要加一个“;”,初学者容易漏写!!!
结构体的声明:
struct student
{
char name[20];
int ID[10];
int sorce;
};
※※注意:声明时不分配内存,定义时需要分配内存。
最好先定义结构体类型,再定义变量。
struct student
{
char name[20];
int ID[10];
int sorce;
};//定义结构体类型
struct student stu1;//定义变量
3.结构体变量的初始化
正确操作:
#include<stdio.h>
struct student
{
char name[20];
char ID[10];
int sorce;
};
int main()
{
struct student stu1={"LiHua","123",100};
printf("%s %s %d",stu1.name,stu1.ID,stu1.sorce);
return 0;
}
错误操作:
#include<stdio.h>
struct student
{
char name[20];
char ID[10];
int sorce;
};
int main()
{
struct student stu1;
stu1={"LiHua","123",100};
printf("%s %s %d",stu1.name,stu1.ID,stu1.sorce);
return 0;
}
你看出来上面两个代码有什么区别了吗?
没错,仅仅只有一个区别
//正确
struct student stu1={"LiHua","123",100};
//错误
struct student stu1;
stu1={"LiHua","123",100};
大家在初始化结构体的时候可不要犯这种错误。
4.结构体变量的输出
结构体不能整体输出,想输出哪个,必须明确的指明成员变量的名称。
printf("%s %s %d",stu1.name,stu1.ID,stu1.sorce);
对于普通变量,通过“.”操作符引用成员变量。
“.”被称为成员运算符。
5.结构体变量的输入
结构体变量的输入与结构体变量的输出类似,不能整体输入,想输入哪个必须明确指明成员变量的地址。
struct student stu2;
scanf("%s %s %d",stu2.name,stu2.ID,&stu2.sorce);
6.结构体变量之间的赋值
结构体变量之间可以直接赋值
struct student stu1={"LiHua","123",100};
struct student stu3;
stu3=stu1;
printf("%s %s %d",stu3.name,stu3.ID,stu3.sorce);
7.结构体数组
int main()
{
struct student stu[3]={
{"LiHua","123",100},
{"LiMing","124",90},
{"LiLei","125",80}
};
for(int i=0;i<3;i++){
printf("%s %s %d\n",stu[i].name,stu[i].ID,stu[i].sorce);
}
return 0;
}
8.结构体指针
int main()
{
struct student stu={"LiHua","123",100};
struct student *p=0;
p=&stu;
printf("%s %s %d\n",stu.name,stu.ID,stu.sorce);
printf("%s %s %d\n",(*p).name,(*p).ID,(*p).sorce);
printf("%s %s %d\n",p->name,p->ID,p->sorce);
return 0;
}
通过指针引用成员变量有两种形式:
(1)(*p).sorce=100;//*p等价于stu
(2)p->sorce=100;
指针变量通过“->”操作符引用成员变量。
“->”也被称为:成员运算符。
通常我们习惯第二种用法。
9.结构体指针作为函数参数
#include<stdio.h>
struct student
{
char name[20];
char ID[10];
int sorce;
};
void STU(struct student *stu){
stu->sorce=90;
}
int main()
{
struct student stu={"LiHua","123",100};
STU(&stu);
printf("%s %s %d\n",stu.name,stu.ID,stu.sorce);
return 0;
}
把结构体stu的地址传过去后stu.sorce的值成功的发生了变化。
共用体
1.共用体的定义
共用体与结构体十分相似,在定义上也有很多共同之处。
共用体类型定义:
union 共用体名
{
数据类型 成员1;
数据类型 成员2;
数据类型 成员3;
. . . . . .
};
共用体与结构体在储存上存在差异,共用体的所有成员,共享同一块存储空间(所有成员中所占存储空间最大的那块空间)。
共用体变量定义:
定义共用体变量时最好和定义结构体变量时一样,先定义共用体类型,再定义共用体变量。
union data
{
int a;
char ch;
float c;
};
union data UD;
2.共用体的内存
3.共用体变量的初始化
共用体变量定义的同时,只能对其所有成员中的一个成员的类型值进行初始化。
初始化太多会出现上述错误。
#include<stdio.h>
union data
{
int a;
char ch;
float f;
};
int main()
{
union data UD={10};
printf("%d\n",UD.a);
return 0;
}
只初始化一个则可正常运行。
结语
大一双非本科学生希望通过自己的努力提高编程能力,希望能得到大家的支持和关注,如果文章中有什么错误或者不恰当的地方,希望您能提出建议,我定会改正,谢谢观看!!!