前言

在C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型)。本文主要介绍关于结构体以下几部分。
在这里插入图片描述


一、结构体的概念

1.结构体是什么?

在实际的应用中,往往变量的类型复杂多变,我们仅仅使用C语言内置的类型无法准确的去定义变量,所以引出了结构体这个概念。也就是说,为了描述复杂类型的个体,只用C语言基础的内置类型不能完整的表述,而结构体就可以很好的解决这个问题。
结构体本质上还是一种数据类型,但它可以包括若干个“成员”,每个成员的类型可以相同也可以不同,也可以是基本数据类型或者又是一个构造类型。

2.如何定义一个结构体?

如何定义一个结构体,一般定义的形式如下所示:

//结构体的定义
struct + 结构体名称
{
	成员列表;
};

【注】在定义结构体的时候,大括号最后一定不要忘记分号:‘;’
我们举个简单的例子:我们定义一个名为Student的结构体,该结构体的成员包括:姓名,学号,性别,年龄,总成绩等。

//struct是一个
struct Student   //定义一个名为Student的结构体
{
	char name[20];  //姓名
	int id;  //学号
	char sex;  //性别(1:男  0:女)
	int age;  //年龄
	int score;  //总成绩
};

结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员。在上面的例子中,Student为结构体名,它包含了5个成员,分别是:name,id,sex,age,score。特别注意,结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化

3.结构体变量

既然结构体是一种数据类型,那它就像C语言基础的内置类型一样,可以去定义变量,下面就举个简单的例子:
(1)结构体变量的定义可以放在结构体的声明之后:

struct Student   //定义一个名为Student的结构体
{
	char name[20];  //姓名
	int id;  //学号
	char sex;  //性别(1:男  0:女)
	int age;  //年龄
	int score;  //总成绩
};
struct Student stu;  //定义一个结构体变量

(2)结构体变量的定义也可以在结构体声明的同时定义,这样就简化了代码:

struct Student   //定义一个名为Student的结构体
{
	char name[20];  //姓名
	int id;  //学号
	char sex;  //性别(1:男  0:女)
	int age;  //年龄
	int score;  //总成绩
}stu;  //在结构体声明的同时定义一个结构体变量stu

在实际的定义中,往往使用第二种方法

struct Student stu1; //C语言中,利用结构体去定义变量的时候,必须加上struct,不能省略
Student stu2; //C++中,利用结构体去定义变量的时候,可以省略struct,可直接使用结构体名去定义

(3)还可以使用匿名结构体来定义结构体变量

struct   //没有结构体名
{
	char name[20];  //姓名
	int id;  //学号
	char sex;  //性别(1:男  0:女)
	int age;  //年龄
	int score;  //总成绩
}stu;  //使用匿名结构体来定义一个结构体变量stu

但要注意的是这样的方式虽然简单,但不能再次定义新的结构体变量了,也就是说,这种定义方式只能定义一次,不能重新再去定义别的变量。在使用的时候,要尤其注意。

4.结构体变量的初始化

4.1结构体成员的访问

虽然结构类似一个数组,只是数组元素的数据类型是相同的,而结构中元素的数据类型是可以不同的。但结构不能像数组那样使用下标去访问其中的各个元素,而应该用结构成员运算符点(.)。即访问成员的一般形式是:
结构体变量名.成员名
举个简单的例子:

struct Student stu; //定义一个结构体变量stu
stu.name; //通过stu.去访问结构体中的成员name,表示学生stu的姓名name
stu.age; //通过stu.去访问结构体中的成员age,表示学生stu的年龄age

我们可以通过运算符(.)去访问结构体成员,例如:
在这里插入图片描述
当我们使用结构体变量去访问成员的时候,输入运算符.其后面就会出现结构体成员列表,我们选择要访问的成员即可。这也说明我们定义的结构体变量是正确的。

4.2结构体变量的初始化

接上面结构体Student的例子,这里我们对其结构体变量stu1初始化:

struct Student stu1 = { “张飞”, 001, 1, 20, 400 }; //姓名:张飞,学号:001,性别:男(1表示男,0表示女),年龄:20,总成绩:400

struct Student stu1;  //若不给结构体初始值,则里面的值均为【随机值】
struct Student stu2 = { "Feizhang" };  //若给结构体只赋值一部分,则后面的全部赋为0
struct Student* stup = &stu1;  //定义一个结构体类型的指针stup,指向stu1
struct Student* stuq;  //理论上stuq为随机值,但在这里指向0Xcccccccc(Debug模式下会优化为cccccccc)
struct Student Stu_arr[10];  //定义一个结构体数组,若不给初始值,则为随机值

二、结构体的使用

1.如何去使用结构体?

1.1结构体的普通变量如如何访问结构体成员

结构体普通变量如何访问其成员:C语言规定,结构体的普通成员可以通过运算符“点.”去访问其成员,例如:

struct Student stu1 = { "Bulv", 20, 1001, 1, 90 };  //定义结构体变量stu1并初始化
struct Student stu2 = { "Feizhang", 22, 1002, 1, 95 };  //定义结构体变量stu2并初始化
stu1.id = 1003;  //通过结构体变量stu1去访问成员id,并将其值修改为1003
printf("%s\n", stu1.name);  //打印学生stu1的姓名
printf("%d\n", stu1.age);  //打印学生stu1的年龄
strcpy_s(stu1.name, 10, "caopi");  //修改stu1的第一个变量name的值(char类型不能直接赋值)
1.2结构体的指针变量如何访问其成员

结构体的指针变量如何访问其成员:可以通过箭头符号的方式去访问其成员:

(*p).name == p -> name //左右两种访问方式等价

举个简单的例子:

struct Student stu = { "刘备", 20, 1001, 1, 90 };  //定义结构体变量stu1并初始化
struct Student *p = &stu;  //定义一个结构体指针p去指向结构体变量stu
(*p).age = 23; //等价于p -> age = 23;   //将年龄修改为23
strcpy_s((*p).name, "张飞");//注意点和星号的优先级

【注】结构体成员如果是字符串,不能直接通过赋值号“=”去修改值,可以通过C语言中的拷贝函数strcpy去修改值。

2.结构体数组

在上面的例子中,我们都只是定义一个结构体变量,但在实际中,结构体变量不止一个,所以就需要一个数组来去存储。对比一般数组的定义,结构体数组也可以用相同的方式去定义、使用。下面举个例子:

struct Student  //定义一个名为Student结构体
{
	char name[20];  //姓名
	int age;  //年龄
	int id;  //学号
}stu[5];  //定义一个结构体数组stu[5],其长度是5,相当于要记录5个学生的信息

如何去使用结构体数组呢?如何访问结构体数组呢?我们看个简单的例子:
在这里插入图片描述

【更正】:上述 stu[3] 是定义了一个结构体数组,其长度是 3,不是 5(笔者手误);


总结

总结:以上是对结构体的定义以及如何使用做了简单的介绍,C语言中,我们实际要求的变量类型不能仅仅只通过C语言基础内置类型来定义,所以就引出了结构体,利用结构体来定义我们的变量,可以满足我们的要求,但是要注意的几点就是:
1.结构体如何定义,在定义的时候可以同时定义一个结构体变量,末尾必须以分好结尾;
2.结构体变量如何去访问其成员,可以通过运算符"."去访问;结构体指针变量如何去访问成员,可以通过箭头的形式去访问,例如:(*p).name == p -> name //左右两种访问方式等价。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐