你真的了解结构体和共用体吗?

目录

结构体

1.为什么需要结构体

2.定义结构体

3.结构体变量的初始化

4.结构体变量的输出

5.结构体变量的输入

6.结构体变量之间的赋值

 7.结构体数组

8.结构体指针

9.结构体指针作为函数参数

共用体

1.共用体的定义

 2.共用体的内存

3.共用体变量的初始化

结语


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;
 } 

只初始化一个则可正常运行。

结语

        大一双非本科学生希望通过自己的努力提高编程能力,希望能得到大家的支持和关注,如果文章中有什么错误或者不恰当的地方,希望您能提出建议,我定会改正,谢谢观看!!!

猜你喜欢

转载自blog.csdn.net/qq_61139806/article/details/124172529
今日推荐