C++ 指向结构体的指针
在 C++ 中,结构体是一种用户自定义的数据类型,可以将不同种类的数据组合到一个结构体中,便于管理和操作。而指针是一种特殊的变量,它存储的是内存地址,可以通过指针来访问和修改内存中的数据。将指针与结构体结合使用,可以实现对结构体的灵活操作。本文将详细介绍 C++ 中指向结构体的指针的使用。
1. 定义结构体
在开始讲解指向结构体的指针之前,我们先来了解一下如何定义并使用结构体。
结构体的定义使用 struct
关键字,后接结构体的名称和花括号内的成员变量。下面是一个简单的示例:
#include <iostream>
using namespace std;
struct Person {
string name;
int age;
};
int main() {
Person p1;
p1.name = "Alice";
p1.age = 20;
cout << "Name: " << p1.name << endl;
cout << "Age: " << p1.age << endl;
return 0;
}
运行上述代码,输出如下:
Name: Alice
Age: 20
在上述示例中,我们定义了一个名为 Person
的结构体,它有两个成员变量 name
和 age
。然后在 main
函数中,创建了一个 Person
类型的变量 p1
,并通过 .
操作符访问和修改了结构体的成员变量。
2. 指向结构体的指针
指向结构体的指针是指针变量,它存储的是结构体的地址。通过指针可以方便地操作结构体,例如访问和修改结构体的成员变量。
为了定义指向结构体的指针,需要在指针类型前加上 struct
关键字和结构体的名称。下面是一个示例:
#include <iostream>
using namespace std;
struct Person {
string name;
int age;
};
int main() {
Person p1;
p1.name = "Alice";
p1.age = 20;
Person* ptr;
ptr = &p1;
cout << "Name: " << ptr->name << endl;
cout << "Age: " << ptr->age << endl;
return 0;
}
运行上述代码,输出与之前相同:
Name: Alice
Age: 20
在上述示例中,我们首先定义了一个名为 ptr
的指向 Person
结构体的指针。然后,将 p1
的地址赋值给指针变量 ptr
,即 ptr = &p1;
。接下来,我们使用 ->
操作符通过指针来访问和修改结构体的成员变量。
3. 动态分配结构体内存
在 C++ 中,可以使用 new
运算符动态分配内存来创建结构体的实例。动态分配的结构体实例会在堆上分配内存,可以通过指针来访问和操作。
下面是一个示例代码:
#include <iostream>
using namespace std;
struct Person {
string name;
int age;
};
int main() {
Person* ptr = new Person; // 动态分配内存
ptr->name = "Bob";
ptr->age = 25;
cout << "Name: " << ptr->name << endl;
cout << "Age: " << ptr->age << endl;
delete ptr; // 释放内存
return 0;
}
运行上述代码,输出如下:
Name: Bob
Age: 25
在上述示例中,我们使用 new
运算符动态分配了一个 Person
结构体的实例,并将其地址赋值给指针变量 ptr
。然后,通过指针变量 ptr
来访问和修改结构体的成员变量。最后,使用 delete
运算符释放动态分配的内存。
4. 指向结构体的指针数组
在实际应用中,可能会需要存储多个结构体实例,并使用指针数组来管理这些实例。指针数组是指数组中的每个元素都是指针。通过指针数组,可以方便地对多个结构体实例进行操作。
下面是一个示例代码:
#include <iostream>
using namespace std;
struct Person {
string name;
int age;
};
int main() {
const int size = 3;
Person* ptrArr[size]; // 指针数组
for (int i = 0; i < size; i++) {
ptrArr[i] = new Person; // 动态分配内存
ptrArr[i]->name = "Person " + to_string(i);
ptrArr[i]->age = 20 + i;
cout << "Name: " << ptrArr[i]->name << ", Age: " << ptrArr[i]->age << endl;
}
for (int i = 0; i < size; i++) {
delete ptrArr[i]; // 释放内存
}
return 0;
}
运行上述代码,输出如下:
Name: Person 0, Age: 20
Name: Person 1, Age: 21
Name: Person 2, Age: 22
在上述示例中,我们首先定义了一个大小为 size
的指针数组 ptrArr
,其中每个元素都是 Person
结构体的指针。然后,使用循环动态分配了 size
个 Person
结构体实例,并通过指针数组来访问和修改每个实例的成员变量。最后,使用循环来释放动态分配的内存。
5. 结构体指针作为函数参数
结构体指针还可以作为函数的参数传递,从而可以在函数内部对结构体进行修改。通过传递指针而不是结构体的副本,可以提高程序的性能和效率。
下面是一个示例代码:
#include <iostream>
using namespace std;
struct Person {
string name;
int age;
};
void updatePerson(Person* ptr) {
ptr->name = "Charlie";
ptr->age = 30;
}
int main() {
Person p1;
p1.name = "Alice";
p1.age = 20;
cout << "Before update: ";
cout << "Name: " << p1.name << ", Age: " << p1.age << endl;
// 将结构体指针作为参数传递给函数
updatePerson(&p1);
cout << "After update: ";
cout << "Name: " << p1.name << ", Age: " << p1.age << endl;
return 0;
}