- 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
1.结构体的定义和使用
语法:struct 结构体名 { 结构体成员列表 };
通过结构体创建变量的方式有三种:
-
struct 结构体名 变量名
-
struct 结构体名 变量名 = { 成员1值 , 成员2值…}
-
定义结构体时顺便创建变量
//创建一个学生结构体 struct Student { string name; int age; float score; }s3;//方式3:定义结构体时顺便创建变量 //主函数 int main() { struct Student s1;//方式1 s1.name = "张三"; s1.age = 18; s1.score = 100; struct Student s2 = { "李四",20,99.5 };//方式2 s3.name = "王五"; s3.age = 17; s3.score = 59.4; cout << " s1姓名:" << s1.name << " s1年龄:" << s1.age << " s1成绩:" << s1.score << endl; cout << " s2姓名:" << s2.name << " s2年龄:" << s2.age << " s2成绩:" << s2.score << endl; cout << " s3姓名:" << s3.name << " s3年龄:" << s3.age << " s3成绩:" << s3.score << endl; return 0; } //注意:输出String类型时,必须在程序头加上`#include <string>`
注意:struct
关键字在初始化时也可省略
2.结构体数组
-
**作用:**将自定义的结构体放入数组中方便维护
-
语法:
struct 结构体名 数组名[元素个数] = { {},{},...,{}}
//主函数 int main() { Student arr[3] = { {"张三",20,100}, {"李四",18,99.5}, {"王五",17,59.4} }; arr[0].name = "赵六"; for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i) { cout << " 姓名:" << arr[i].name << " 年龄:" << arr[i].age << " 成绩:" << arr[i].score << endl; } return 0; }
3.结构体指针
**作用:**通过指针访问结构体中的成员
-
利用操作符
->
可以通过结构体指针访问结构体属性int main() { Student s1 = { "张三",20,100 }; Student* p = &s1;//定义指针时也要用结构体定义!!! cout << " 姓名:" << p->name << " 年龄:" << p->age << " 成绩:" << p->score << endl; }
4.结构体嵌套结构体
**作用:**结构体中的成员可以是另一个结构体
**例如:**每个老师教1个学生,一个老师的结构体中,记录一个学生的结构体
//创建一个老师结构体
struct Teacher
{
int id;
string name;
Student stu;
};
//主函数
int main()
{
Student s1 = { "张三",20,100 };
Teacher t1 = { 123456,"李老师",s1 };
cout << " 教职工编号:" << t1.id << " 姓名:" << t1.name << endl;
cout << " 所带学生姓名为:" << t1.stu.name << " 年龄为:" << t1.stu.age << " 成绩为:" << t1.stu.score <<endl;
return 0;
}
5.结构体做函数参数
**作用:**将结构体作为参数向函数中传递
传递方式有两种:
-
值传递
-
地址传递
**注意:**地址传递与值传递对实参本身的影响
//值传递
void PrintStu1(struct Student s)
{
s.name = "李四";//修改值后注意控制台变化
cout << " 姓名:" << s.name << " 年龄:" << s.age << " s成绩:" << s.score << endl;
}
//地址传递
void PrintStu2(struct Student* p)
{
p->name = "王五";
cout << " 姓名:" << p->name << " 年龄:" << p->age << " s成绩:" << p->score << endl;
}
//主函数
int main()
{
Student s1 = { "张三",20,100 };
PrintStu1(s1);
PrintStu2(&s1);
cout << " 姓名:" << s1.name << " 年龄:" << s1.age << " s成绩:" << s1.score << endl;
return 0;
}
6.结构体中const
的使用场景
**作用:**用const
防止误操作
//将函数中的形参改为指针,可以减少内存使用,且不会复制新的副本出来
void PrintStu(const struct Student* p)
{
//p->name = "王五";//操作失败,因为加入const
cout << " 姓名:" << p->name << " 年龄:" << p->age << " s成绩:" << p->score << endl;
}
//主函数
int main()
{
Student s1 = { "张三",20,100 };
PrintStu(&s1);
return 0;
}