在C++中,指向结构体的指针是一种常用的数据操作方式,指针和结构体建立联系后,就可以通过指针间接访问和修改结构体的成员。
1、定义指向结构体的指针
(1) 首先定义结构体
struct Student {
int id;
string name;
float score;
};
(2) 定义指向结构体的指针
Student s1 = {101, “Alice”, 95.5};
Student* ptr = &s1; // 定义结构体指针ptr,结构体指针ptr 指向 s1 的地址(可理解为将变量s1的地址赋值给指针ptr)
在C/C++中的任何“东四”(变量、函数名、数组名等等)都有地址,定义一个指针,将指针指向这些地址,就可以对指向的地址中的内容进行操作。因此,当定义完结构体指针之后,通过结构体指针就可以对结构体中的数据进行读写操作。
2、通过指针访问成员
(1) 使用“ ->”运算符
cout << ptr->id << endl; // 输出 101
cout << ptr->name << endl; // 输出 “Alice”
ptr->score = 99.0; // 修改成员值
(2) 使用 (*ptr). 运算符
cout << (*ptr).id << endl; // 输出 101(等价于 ptr->id)
(*ptr).name = “Bob”; // 修改成员
注意:-> 是更简洁的写法,优先使用。
3、动态分配结构体指针
(1) 使用 new 动态分配
Student* ptr = new Student{102, “Charlie”, 88.5};
cout << ptr->name << endl; // 输出 “Charlie”
delete ptr; // 必须手动释放内存!
(2) 使用 new 动态分配结构体数组
Student* arr = new Student[3]{
{103, “Dave”, 70.0},
{104, “Eve”, 85.5},
{105, “Frank”, 92.0}
};
cout << arr[1].name << endl; // 输出 “Eve”
delete[] arr; // 释放数组
4、结构体指针与 const
指向常量的指针:不能通过指针修改结构体成员。
const Student* ptr = &s1;
//ptr->id = 200; // 错误!不可修改。在ptr有const修饰,因此ptr是指向常量的指针
cout << ptr->name << endl; // 允许读取
常量指针:指针本身不可修改指向。
Student* const ptr = &s1;
ptr->id = 200; // 允许修改成员
// ptr = &s2; // 错误!指针不可修改
指向结构体的指针总结
用途:动态管理结构体、函数间高效传递结构体、构建复杂数据结构(如链表、树)。
操作:用 -> 访问成员,动态分配需 new/delete,动态分配的内存必须手动释放,使用 const 增强安全性。