结构体是用户根据需求自定义的数据类型,允许用户储存基本数据类型之外的数据,
结构体是C++中一种复合数据类型,它允许将多个不同类型的变量组合在一起。结构体通常用来表示一组相关的数据。
结构体的定义通常遵循以下格式:
struct StructName {
DataType1 member1;
DataType2 member2;
...
DataTypeN memberN;
};
其中,StructName是结构体的名称,DataType是成员的数据类型,member是成员的名称。
示例:
struct Student {
string name;
int age;
double gpa;
};
在上面的代码中,定义了一个名为Student的结构体。这个结构体包含三个成员:name、age和gpa。它们分别表示学生的姓名、年龄和平均成绩。
要使用一个结构体,需要先声明一个结构体变量。结构体变量的声明通常遵循以下格式:
StructName variableName;
其中,StructName是结构体的名称,variableName是变量的名称。
例如,下面是一个简单的结构体变量声明的例子:
Student s;//声明了一个Student类型的变量s
接下来,可以使用点运算符.来访问和修改结构体变量中的成员。
s.name = "Alice";
s.age = 20;
s.gpa = 3.9;
cout << s.name << " " << s.age << " " << s.gpa << endl; // 输出Alice 20 3.9
使用数组来存储多个结构体的信息:
// 定义一个数组来存储3个学生的信息
Student students[3] = {
{"张三", 18, 90.5},
{"李四", 19, 85.0},
{"王五", 20, 95.5}
};
计算平均成绩:
// 计算平均成绩
float sum = 0;
for (int i = 0; i < 3; i++) {
sum += students[i].score;
}
float average = sum / 3;
结构体指针是指向结构体的指针,通过指针来访问结构体中的数据成员。
// 定义一个学生结构体
Student stu = {"张三", 18, 90.5};
// 定义一个指向学生结构体的指针
Student *pStu = &stu;
// 使用指针访问和修改结构体中的数据
cout << "姓名:" << pStu->name << endl;
cout << "年龄:" << pStu->age << endl;
cout << "成绩:" << pStu->score << endl;
pStu->score = 95.0;
cout << "修改后的成绩:" << pStu->score << endl;
-> 运算符相当于解引用指针后再使用 . 运算符来访问成员
Student *pStu = ...; // 指向一个 Student 结构体的指针
cout << pStu->name; // 访问 name 成员
等价于:
Student *pStu = ...; // 指向一个 Student 结构体的指针
cout << (*pStu).name; // 解引用指针后再使用 . 运算符访问 name 成员
结构体可以嵌套定义,即一个结构体中可以包含另一个结构体作为它的成员。
// 定义一个结构体表示学生的地址信息
struct Address {
string city; // 城市
string street; // 街道
int zip; // 邮编
};
// 定义一个结构体表示学生信息
struct Student {
string name; // 姓名
int age; // 年龄
float score; // 成绩
struct Address address; // 地址信息
};
使用和访问:
// 定义一个学生结构体
Student stu = {"张三", 18, 90.5, {"北京", "长安街", 100000}};
// 访问学生的地址信息
cout << "城市:" << stu.address.city << endl;
cout << "街道:" << stu.address.street << endl;
cout << "邮编:" << stu.address.zip << endl;
Student 结构体中还包含一个 address 成员,它是一个 Address 类型的结构体,用来存储学生的地址信息。
作为函数参数,可以通过值传递和地址传递。
值传递函数定义:
// 定义一个函数,使用值传递的方式接收结构体参数
void printStudent1(Student stu) {
cout << "使用值传递:" << endl;
cout << "姓名:" << stu.name << endl;
cout << "年龄:" << stu.age << endl;
cout << "成绩:" << stu.score << endl;
}
地址传递函数定义:
// 定义一个函数,使用地址传递的方式接收结构体参数
void printStudent2(Student *pStu) {
cout << "使用地址传递:" << endl;
cout << "姓名:" << pStu->name << endl;
cout << "年龄:" << pStu->age << endl;
cout << "成绩:" << pStu->score << endl;
}
使用:
// 定义一个学生结构体
Student stu = {"张三", 18, 90.5};
// 调用函数打印学生信息
printStudent1(stu);
printStudent2(&stu);
const 关键字可以用来修饰结构体的成员变量,表示该成员变量的值是不可修改的。这样就可以保证结构体中某些数据的不变性,提高程序的可靠性和安全性。
#include
#include
using namespace std;
// 定义一个结构体表示学生信息
struct Student {
const string name; // 姓名(不可修改)
int age; // 年龄
float score; // 成绩
};
int main() {
// 定义一个学生结构体
Student stu = {"张三", 18, 90.5};
// 尝试修改学生的姓名(会编译错误)
// stu.name = "李四";
return 0;
}
除了在定义结构体时使用 const 关键字修饰成员变量外,我们还可以在定义结构体指针时使用 const 关键字。例如:
Student stu = {"张三", 18, 90.5};
const Student *pStu = &stu;
上面的代码定义了一个指向 Student 类型的指针 pStu,并使用 const 关键字修饰,也叫常量指针。这表示不能通过 pStu 指针来修改它所指向的结构体的值。因此,下面的代码会发生编译错误:
pStu->age = 20; // 编译错误
更多指针的用法以及指针和const的使用详见博客C++基础篇(三)指针详解与示例