大家好:
衷心希望各位点赞。
您的问题请留在评论区,我会及时回答。
一、结构体
C语言中,结构体是用户根据实际问题而自行建立的一种数据类型,是由一系列相同或不同数据类型的数据构成的集合。在实际问题中,一个对象往往具有多个属性,需要一组不同类型的数据来表示。比如:手机通讯录中的一条记录应该包括编号、姓名、电话号码、性别、生日、地址等信息。显然单个基本数据类型或数组不能表达一条通讯记录,这时就需要用到结构体类型。结构体类型同C语言的基本数据类型一样,可以赋值、作为函数的参数、作为函数的返回值。
1、结构体定义
结构体是由一个或多个变量组成的集合。这些变量称为结构成员,结构成员可以是相同类型,也可以是不同类型。结构体定义形式如下:
struct 结构体名
{
数据类型 成员名;
数据类型 成员名;
数据类型 成员名;
...
};
结构体名是定义结构体数据类型的名字,在“{”和“}”之间的是结构体成员的列表,每一个结构体成员由一个数据类型和合法标识符组成。
在程序中定义结构体时,需要注意结构体成员可以是另外一个结构体类型,比如:
struct Date
{
int year;
int month;
int day;
};
struct Person
{
string name;
struct Date birthday;
};
2、结构体使用
通过结构体创建变量的方式有三种:
struct 结构体名 变量名;
struct 结构体名 变量名 = { 成员1值, 成员2值...};
定义结构体时,顺便创建变量。
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
//创建学生数据类型:结构成员包括姓名、年龄、分数
//struct关键字不可省略
struct Student
{
//成员列表
string name;//姓名
int age;//年龄
int score;//分数
}s3;//定义结构体时,顺便创建结构体变量
int main(void) {
//1、struct 结构体名 变量名;
struct Student s1;
//给s1的属性赋值
s1.name = "张三";
s1.age = 18;
s1.score = 100;
cout << "姓名:" << s1.name << " 年龄:" << s1.age << " 分数:" << s1.score << endl;
//2、struct 结构体名 变量名 = { 成员1值, 成员2值... };
struct Student s2 = { "李四", 17, 90 };
cout << "姓名:" << s2.name << " 年龄:" << s2.age << " 分数:" << s2.score << endl;
//3、定义结构体时,顺便创建结构体变量
s3.name = "王五";
s3.age = 16;
s3.score = 80;
cout << "姓名:" << s3.name << " 年龄:" << s3.age << " 分数:" << s3.score << endl;
system("pause");
return 0;
}
运行截图:
二、结构体数组
结构体数组是具有相同结构体类型的变量的集合,可以用于存储和处理一批相同结构体类型的数据。结构体数组的每一个元素都是结构体类型数据,每一个元素都包括含该结构体类型的所有成员。
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
struct Student
{
//成员列表
string name;//姓名
int age;//年龄
int score;//分数
};
int main(void) {
//创建结构体数组
struct Student stuArray[3];
stuArray[0] = { "张三", 18, 100 };
stuArray[1] = { "李四", 17, 90 };
stuArray[2] = { "王五", 16, 80 };
for (int i = 0; i < 3; i++) {
cout << "姓名:" << stuArray[i].name
<< " 年龄:" << stuArray[i].age
<< " 分数:" << stuArray[i].score << endl;
}
cout << "----------" << endl;
//创建结构体数组,同时赋初值
struct Student stuArray1[3] = {
{ "小明", 8, 100 },
{ "小军", 7, 90 },
{ "小红", 6, 80 }
};
for (int i = 0; i < 3; i++) {
cout << "姓名:" << stuArray1[i].name
<< " 年龄:" << stuArray1[i].age
<< " 分数:" << stuArray1[i].score << endl;
}
system("pause");
return 0;
}
运行截图:
三、结构体指针
作用:通过指针访问结构体中的成员,利用指向运算符‘ -> ’可以通过结构体指针访问结构体成员。
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
struct Student
{
//成员列表
string name;//姓名
int age;//年龄
int score;//分数
};
int main(void) {
//创建结构体变量,并初始化
struct Student stu = { "张三", 18, 100 };
//创建结构体指针,并指向结构体变量
struct Student* p = &stu;
//结构体指针通过‘ -> ’访问成员
cout << "姓名:" << p->name
<< " 年龄:" << p->age
<< " 分数:" << p->score << endl;
system("pause");
return 0;
}
运行截图:
四、结构体嵌套结构体
定义:结构体中的成员可以是另外一个结构体。
比如:每一个老师辅导一个学生,一个老师结构体中,记录一个学生结构体。
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
struct Student
{
//成员列表
string name;//姓名
int age;//年龄
int score;//分数
};
struct Teacher
{
int id; //教师编号
string name;
int age;
struct Student stu; //辅导的学生
};
int main(void) {
struct Teacher t1;
t1.id = 1000;
t1.name = "李老师";
t1.age = 40;
t1.stu.name = "张三";
t1.stu.age = 18;
t1.stu.score = 100;
cout << "教师 职工编号:" << t1.id
<< " 姓名:" << t1.name
<< " 年龄:" << t1.age << endl;
cout << "学生 姓名:" << t1.stu.name
<< " 年龄:" << t1.stu.age
<< " 分数:" << t1.stu.score << endl;
system("pause");
return 0;
}
运行截图:
五、结构体作函数参数
像其他普通类型一样,结构体类型也可以作为函数的参数类型和函数的返回值类型,用结构体变量作为函数实参,与普通变量作为函数实参没有区别,都是传值调用。在函数内部对其操作,不会引起结构体各个成员值的变化。
作用:把结构体作为参数向函数中传递。
传递方式有两种:值传递、地址传递
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
struct Student
{
//成员列表
string name;//姓名
int age;//年龄
int score;//分数
};
struct Teacher
{
int id; //教师编号
string name;
int age;
struct Student stu; //辅导的学生
};
void printTeacher(struct Teacher t);//值传递
void printStudent(struct Student* s);//地址传递
int main(void) {
struct Teacher t1;
struct Student s;
t1.id = 1000;
t1.name = "李老师";
t1.age = 40;
t1.stu.name = "张三";
t1.stu.age = 18;
t1.stu.score = 100;
s.name = "李四";
s.age = 17;
s.score = 100;
printTeacher(t1);
printStudent(&s);
system("pause");
return 0;
}
void printTeacher(struct Teacher t) {
cout << "教师 职工编号:" << t.id
<< " 姓名:" << t.name
<< " 年龄:" << t.age << endl;
}
void printStudent(struct Student* s) {
cout << "学生 姓名:" << s->name
<< " 年龄:" << s->age
<< " 分数:" << s->score << endl;
}
运行截图:
六、结构体中const使用场景
作用:使用 const 防止误操作。
将函数中的形参改为指针,可以减少内存空间,这样不会复制新的副本出来。为了防止函数修改指针指向的数据,加上 const 修饰,防止误操作。
void printStudent(const struct Student* s) {
s->name = 100;//报错,加入const,一旦有修改的操作就会报错,可以防止误操作
cout << "学生 姓名:" << s->name
<< " 年龄:" << s->age
<< " 分数:" << s->score << endl;
}