文章目录
原文链接
一、结构体基本概念
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
二、使用及定义
语法:struct 结构体名 {结构体成员列表};
//struct 结构体名 {结构体成员列表};
struct animals
{
//成员列表
QString name;
int age;
QString color;
}cat;//在定义结构体时顺便创建结构体变量
通过结构体创建变量的方式有三种:
- struct 结构体名 变量名
//通过结构体创建变量——struct 结构体名 变量名
animals cat1;
cat1.name = "小花";
cat1.age = 2;
cat1.color = "花";
qDebug() << "第一只小猫的名字是" << cat1.name << ",年龄是" << cat1.age << "岁,颜色是" << cat1.color;
也可以写成
typedef struct
在 C++ 中通常用于为结构体(struct)定义一个别名,这样可以使用一个简单的名字来代替完整的 struct 名字
typedef struct animals
{
//成员列表
QString name;
int age;
QString color;
}cat;//在定义结构体时顺便创建结构体变量
//如果使用typedef struct ,这边需要声明,和通过结构体创建变量——struct 结构体名 变量名一样
animals cat;
//通过结构体创建变量——结构体变量利用操作符“.”访问成员
cat.name = "小白";
cat.age = 1;
cat.color = "白色";
qDebug() << "第三只小猫的名字是" << cat.name << ",年龄是" << cat.age << "岁,颜色是" << cat.color;
- struct 结构体名 变量名={成员1值,成员2值…}
//通过结构体创建变量——struct 结构体名 变量名={成员1值,成员2值...}
animals cat2 = { "牛奶",1.5,"黑白色" };
qDebug() << "第二只小猫的名字是" << cat2.name << ",年龄是" << cat2.age << "岁,颜色是" << cat2.color;
- 定义结构体时顺便创建变量
//通过结构体创建变量——结构体变量利用操作符“.”访问成员
cat.name = "小白";
cat.age = 1;
cat.color = "白色";
qDebug() << "第三只小猫的名字是" << cat.name << ",年龄是" << cat.age << "岁,颜色是" << cat.color;
全部代码
//防止中文乱码
#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>
#include "QString"
#include "iostream"
#include "string"
#include "QDebug"
using namespace std;
//struct 结构体名 {结构体成员列表};
struct animals
{
//成员列表
QString name;
int age;
QString color;
}cat;//在定义结构体时顺便创建结构体变量
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//通过结构体创建变量——struct 结构体名 变量名
animals cat1;
cat1.name = "小花";
cat1.age = 2;
cat1.color = "花";
qDebug() << "第一只小猫的名字是" << cat1.name << ",年龄是" << cat1.age << "岁,颜色是" << cat1.color;
//通过结构体创建变量——struct 结构体名 变量名={成员1值,成员2值...}
animals cat2 = { "牛奶",1.5,"黑白色" };
qDebug() << "第二只小猫的名字是" << cat2.name << ",年龄是" << cat2.age << "岁,颜色是" << cat2.color;
//通过结构体创建变量——结构体变量利用操作符“.”访问成员
cat.name = "小白";
cat.age = 1;
cat.color = "白色";
qDebug() << "第三只小猫的名字是" << cat.name << ",年龄是" << cat.age << "岁,颜色是" << cat.color;
return a.exec();
}
输出结果
三、结构体数组
作用:将自定义结构体放到数组中方便维护
语法:struct 结构体名 数组名[元素个数]={{ },{ },… { } }
//防止中文乱码
#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>
#include "QString"
#include "iostream"
#include "string"
#include "QDebug"
using namespace std;
//1、定义结构体
//struct 结构体名 {结构体成员列表};
struct animals
{
//成员列表
QString name;
int age;
QString color;
}cat;//在定义结构体时顺便创建结构体变量
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//2、创建结构体数组
struct animals cat[5]{
{"小花",2,"花色"},
{"小白",5,"白色"},
{"牛奶",4,"黑白相间"},
{"饺子",3,"棕色"},
{"喵喵",1,"橘色"},
};
//3.给结构体数组中的元素赋值
cat[3].name = "大佬";
cat[3].age = 2;
cat[3].color = "豹纹";
for (animals it :cat)
{
qDebug() << "小猫的名字是" << it.name << ",年龄是" << it.age << "岁,颜色是" << it.color;
}
return 0;
}
输出
四、结构体指针
作用:通过指针访问结构体中的成员
利用操作符->
可以通过结构体指针访问结构体属性
//防止中文乱码
#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>
#include "QString"
#include "iostream"
#include "string"
#include "QDebug"
using namespace std;
//struct 结构体名 {结构体成员列表};
struct animals
{
//成员列表
QString name;
int age;
QString color;
}cat;//在定义结构体时顺便创建结构体变量
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//创建结构体变量
struct animals cat = { "小花",2,"花色" };
struct animals *c = &cat;
//通过指针指向结构体变量
qDebug() << "小猫的名字是" << c->name << ",年龄是" << c->age << "岁,颜色是" << c->color;
return 0;
}
输出
五、结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体
//防止中文乱码
#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>
#include "QString"
#include "iostream"
#include "string"
#include "QDebug"
using namespace std;
//定义学生结构体
struct Student {
QString name;//学生姓名
int age;//学生年龄
int score;//学生编号
};
//定义教师结构体
struct Teacher {
int id;//教师编号
QString name;//教师姓名
int age;//教师年龄
struct Student stu;//辅导的学生
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//结构体嵌套结构体
//创建老师
Teacher t;
t.id = 12023;
t.name = "李文静老师";
t.age = 25;
t.stu.name = "韩梅梅";
t.stu.age = 16;
t.stu.score = 100;
qDebug() << "教师编号:" << t.id << endl;
qDebug() << "教师姓名:" << t.name << endl;
qDebug() << "教师年龄:" << t.age << endl;
qDebug() << "辅导的学生姓名:" << t.stu.name << endl;
qDebug() << "辅导的学生年龄:" << t.stu.age << endl;
qDebug() << "辅导的学生成绩:" << t.stu.score << endl;
return 0;
}
输出
六、结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式有两种
- 值传递
//防止中文乱码
#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>
#include "QString"
#include "iostream"
#include "string"
#include "QDebug"
using namespace std;
//定义学生结构体
struct Student {
int age;//学生年龄
int number;//学生编号
};
// 函数接收结构体作为值传递
void printStudentByValue(Student s) {
qDebug() << "年龄是: " << s.age << ", 编号是: " << s.number << endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个结构体实例
Student student = { 14, 2067 };
// 调用函数,使用值传递
printStudentByValue(student);
return 0;
}
输出
- 地址传递
//防止中文乱码
#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>
#include "QString"
#include "iostream"
#include "string"
#include "QDebug"
using namespace std;
//定义学生结构体
struct Student {
int age;//学生年龄
int number;//学生编号
};
// 函数接收结构体的指针(地址传递)
void printStudentByPointer(Student* s) { qDebug() << "地址传递 年龄是: " << s->age << ", 编号是: " << s->number << endl; };
// 函数接收结构体的引用(引用传递)
void printStudentByReference(const Student& s) { qDebug() << "引用传递 年龄是: " << s.age << ", 编号是: " << s.number << endl; }
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个结构体实例
Student student = { 14, 2067 };
// 调用函数,使用地址传递
printStudentByPointer(&student);
// 调用函数,使用引用传递
printStudentByReference(student);
return 0;
}
值传递 和地址传递的区别
值传递代码:(值传递,形参的改变不会修改实参的值)
//防止中文乱码
#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>
#include "QString"
#include "iostream"
#include "string"
#include "QDebug"
using namespace std;
//定义学生结构体
struct Student {
int age;//学生年龄
int number;//学生编号
};
// 函数接收结构体作为值传递
void printStudentByValue(Student s) {
s.number = 1090; //修改传入的结构体的编号
qDebug() << "值传递 年龄是: " << s.age << ", 编号是: " << s.number << endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个结构体实例
Student s = { 14, 2067 };
// 调用函数,使用值传递
printStudentByValue(s);
qDebug() << "main 函数 值传递 年龄是: " << s.age << ", 编号是: " << s.number << endl;
return 0;
}
输出 形参的改变不会修改实参的值
地址传递代码(地址传递,形参的改变会改变实参的值)
//防止中文乱码
#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>
#include "QString"
#include "iostream"
#include "string"
#include "QDebug"
using namespace std;
//定义学生结构体
struct Student {
int age;//学生年龄
int number;//学生编号
};
// 函数接收结构体的指针(地址传递)
void printStudentByPointer(Student* s) {
s->score = 1090;
qDebug() << "地址传递 年龄是: " << s->age << ", 编号是: " << s->number << endl;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个结构体实例
Student s = { 14, 2067 };
// 调用函数,使用地址传递
printStudentByPointer(&s);
qDebug() << "main 函数 值传递 年龄是: " << s.age << ", 编号是: " << s.number << endl;
return 0;
}
七、结构体中 const的使用场景
作用:用const来防止误操作
//防止中文乱码
#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>
#include "QString"
#include "iostream"
#include "string"
#include "QDebug"
using namespace std;
//定义学生结构体
struct Student {
int age;//学生年龄
int number;//学生编号
};
// 函数接收结构体的引用(引用传递)
void printStudentByReference(const Student *s) {
//加入const 一旦有修改的操作就会报错,可以防止的误操作(只能读不能修改)
//s.age = 21;//修改结构体变量的age属性 错误
qDebug() << "引用传递 年龄是: " << s->age << ", 编号是: " << s->number << endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个结构体实例
Student s = { 14, 2067 };
// 调用函数,使用地址传递
printStudentByPointer(&s);
qDebug() << "main 函数 值传递 年龄是: " << s.age << ", 编号是: " << s.number<< endl;
return 0;
}
报错
输出