结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。
语法: struct 结构体名 {结构体成员列表};
结构体的定义:
#include
// 自定义student类型
struct student
{
std::string name;
int age;
int score;
};
int main(){
system("pause");
return 0;
}
通过结构体创建变量的方式有三种:
创建结构体变量 —— 方式一:
#include
// 自定义student类型
struct student
{
std::string name;
int age;
int score;
};
int main(){
struct student s1; // 创建student结构体的变量s1,此处的struct关键字可以省略
s1.name = "张三"; // 通过 "." 来访问结构体变量中的属性
s1.age = 18;
s1.score = 90;
std::cout << "姓名:" << s1.name << std::endl;
std::cout << "年龄:" << s1.age << std::endl;
std::cout << "分数:" << s1.score << std::endl;
system("pause");
return 0;
}
---------
姓名:张三
年龄:18
分数:90
创建结构体变量 —— 方式二:
#include
// 自定义student类型
struct student
{
std::string name;
int age;
int score;
};
int main(){
struct student s1 = {"李四", 20, 85};
std::cout << "姓名:" << s1.name << std::endl;
std::cout << "年龄:" << s1.age << std::endl;
std::cout << "分数:" << s1.score << std::endl;
system("pause");
return 0;
}
---------
姓名:李四
年龄:20
分数:85
创建结构体变量 —— 方式三:
#include
// 自定义student类型
struct student
{
std::string name;
int age;
int score;
}s1; // 在定义结构体时,同时创建变量
int main(){
s1.name = "王五";
s1.age = 25;
s1.score = 99;
std::cout << "姓名:" << s1.name << std::endl;
std::cout << "年龄:" << s1.age << std::endl;
std::cout << "分数:" << s1.score << std::endl;
system("pause");
return 0;
}
---------
姓名:王五
年龄:25
分数:99
小结: 在定义结构体时,struct关键字不能省略,而在创建结构体变量时则可以省略;前两种创建结构体变量的方式较为常用。
作用: 将自定义的结构体放入到数组中,方便维护
语法: struct 结构体名 数组名[元素个数] = {{}, {}, ..., {}};
#include
// 自定义student类型
struct student
{
std::string name;
int age;
int score;
};
int main(){
// 结构体数组
struct student arr[3] = {
{"张三", 18, 90},
{"李四", 20, 85},
{"王五", 25, 99}
};
// 修改结构体数组的元素
arr[2].name = "赵六";
arr[2].age = 30;
arr[2].score = 100;
for (int i = 0; i < 3; i++){
std::cout << "姓名:" << arr[i].name << " "
<< "年龄:" << arr[i].age << " "
<< "分数:" << arr[i].score << std::endl;
}
system("pause");
return 0;
}
---------
姓名:张三 年龄:18 分数:90
姓名:李四 年龄:20 分数:85
姓名:赵六 年龄:30 分数:100
作用: 通过指针访问结构体中的成员
利用操作符 ->
可以实现通过结构体指针访问结构体属性的目的。
#include
// 自定义student类型
struct student
{
std::string name;
int age;
int score;
};
int main(){
// 创建结构体变量
student s1 = {"张三", 18, 90};
// 通过指针指向结构体变量
student* p = &s1;
// 通过指针访问结构体变量中的属性
std::string name = p->name;
int age = p->age;
int score = p->score;
std::cout << "姓名:" << name << " "
<< "年龄:" << age << " "
<< "分数:" << score << std::endl;
system("pause");
return 0;
}
---------
姓名:张三 年龄:18 分数:90
作用: 将一个结构体作为另一个结构体中的成员,以解决实际问题
例如,一个老师辅导一个学生。
#include
// 定义student结构体
struct student
{
std::string name;
int age;
int score;
};
// 定义teacher结构体
struct teacher
{
int id;
std::string name;
int age;
student s1; // student结构体变量
}
int main(){
// 创建结构体变量
teacher t1 = {1, "张三", 38, {"李四", 18, 90}};
std::cout << "老师编号:" << t1.id << " "
<< "老师姓名:" << t1.name << " "
<< "老师年龄:" << t1.age << " "
<< "学生姓名:" << t1.s1.name << " "
<< "学生年龄:" << t1.s1.age << " "
<< "学生分数:" << t1.s1.score << std::endl;
system("pause");
return 0;
}
---------
老师编号:1 老师姓名:张三 老师年龄:38 学生姓名:李四 学生年龄:18 学生分数:90
传递方式有两种:
#include
// 定义student结构体
struct student
{
std::string name;
int age;
int score;
};
// 值传递
void printStudent1(student stu){
stu.age = 28;
stu.score = 60;
std::cout << "姓名:" << stu.name << " "
<< "年龄:" << stu.age << " "
<< "分数:" << stu.score << std::endl;
}
// 地址传递
void printStudent2(student* p){
p->age = 38;
p->score = 59;
std::cout << "姓名:" << p->name << " "
<< "年龄:" << p->age << " "
<< "分数:" << p->score << std::endl;
}
int main(){
// 创建结构体变量
student s1 = {"张三", 18, 90};
std::cout << "姓名:" << s1.name << " "
<< "年龄:" << s1.age << " "
<< "分数:" << s1.score << std::endl;
printStudent1(s1); // 值传递,改变形参不会影响实参
std::cout << "姓名:" << s1.name << " "
<< "年龄:" << s1.age << " "
<< "分数:" << s1.score << std::endl;
printStudent2(&s1); // 地址传递,改变形参会影响实参
std::cout << "姓名:" << s1.name << " "
<< "年龄:" << s1.age << " "
<< "分数:" << s1.score << std::endl;
system("pause");
return 0;
}
---------
姓名:张三 年龄:18 分数:90
姓名:张三 年龄:28 分数:60
姓名:张三 年龄:18 分数:90
姓名:张三 年龄:38 分数:59
姓名:张三 年龄:38 分数:59