大家好:
衷心希望各位点赞。
您的问题请留在评论区,我会及时回答。
一、结构体
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;
}
运行截图:
五、结构体作函数参数
像其他普通类型一样,结构体类型也可以作为函数的参数类型和函数的返回值类型,用结构体变量作为函数实参,与普通变量作为函数实参没有区别,都是传值调用。在函数内部对其操作,不会引起结构体各个成员值的变化。
作用:把结构体作为参数向函数中传递。
传递方式有两种:值传递、地址传递