# 结构体数组与指针

URL: https://caijiao.org/cpp/oop/struct-array
Source: docs/cpp/oop/struct-array.md
Description: 本节将介绍 C++ 中结构体数组与指针的使用方法，讲解如何通过数组和指针操作结构体的元素，以及如何利用指针处理结构体数组中的数据。

结构体数组和结构体指针是 C++ 中重要的概念。在程序中，结构体数组用于存储多个结构体对象，而结构体指针则可以动态地访问和操作结构体的成员。理解这两者的使用对于处理复杂数据结构和提高程序的灵活性至关重要。

## 结构体数组

在 C++ 中，结构体数组是一个包含多个结构体对象的数组。每个数组元素都是一个结构体对象，可以通过索引来访问和修改。

### 示例：定义结构体数组

```cpp
#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

int main() {
    // 创建一个 Person 类型的结构体数组，包含 3 个元素
    Person people[3];

    // 初始化数组元素
    people[0].name = "Alice";
    people[0].age = 25;

    people[1].name = "Bob";
    people[1].age = 30;

    people[2].name = "Charlie";
    people[2].age = 35;

    // 输出数组元素
    for (int i = 0; i < 3; i++) {
        cout << "Name: " << people[i].name << ", Age: " << people[i].age << endl;
    }

    return 0;
}
````

### 输出：

```
Name: Alice, Age: 25
Name: Bob, Age: 30
Name: Charlie, Age: 35
```

在这个例子中，`people` 是一个包含 3 个 `Person` 结构体的数组。每个元素都可以通过数组下标来访问和初始化。

## 结构体指针

结构体指针是一个指向结构体对象的指针，通常用于动态分配内存或通过指针访问结构体的成员。结构体指针通过箭头运算符（`->`）来访问结构体成员。

### 示例：使用结构体指针

```cpp
#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

int main() {
    // 创建一个 Person 类型的结构体
    Person p1 = {"Alice", 25};

    // 定义一个结构体指针，并指向 p1
    Person* ptr = &p1;

    // 使用结构体指针访问成员
    cout << "Name: " << ptr->name << ", Age: " << ptr->age << endl;

    return 0;
}
```

### 输出：

```
Name: Alice, Age: 25
```

在此示例中，`ptr` 是一个指向 `Person` 类型的指针，指向 `p1`。通过 `ptr->name` 和 `ptr->age` 可以访问 `p1` 的成员。

## 结构体数组与指针

结构体数组与指针结合使用时，可以通过指针遍历数组中的每个结构体元素。由于结构体数组的首地址就是数组的第一个元素的地址，因此可以通过指针访问每个结构体。

### 示例：通过指针遍历结构体数组

```cpp
#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

int main() {
    // 创建一个 Person 类型的结构体数组
    Person people[3] = {
        {"Alice", 25},
        {"Bob", 30},
        {"Charlie", 35}
    };

    // 定义一个结构体指针，指向数组的第一个元素
    Person* ptr = people;

    // 通过指针遍历结构体数组
    for (int i = 0; i < 3; i++) {
        cout << "Name: " << ptr->name << ", Age: " << ptr->age << endl;
        ptr++;  // 移动指针到下一个结构体
    }

    return 0;
}
```

### 输出：

```
Name: Alice, Age: 25
Name: Bob, Age: 30
Name: Charlie, Age: 35
```

在此示例中，`ptr` 指向 `people` 数组的第一个元素，通过 `ptr->name` 和 `ptr->age` 可以访问每个结构体的成员。每次迭代时，指针通过 `ptr++` 移动到下一个结构体元素。

## 动态分配结构体数组

在实际开发中，使用指针和动态内存分配（`new` 和 `delete`）来创建和管理结构体数组是一种常见的做法。这样可以根据需要动态创建数组大小，避免内存浪费。

### 示例：动态分配结构体数组

```cpp
#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

int main() {
    // 动态分配一个包含 3 个元素的结构体数组
    Person* people = new Person[3];

    // 初始化数组元素
    people[0].name = "Alice";
    people[0].age = 25;

    people[1].name = "Bob";
    people[1].age = 30;

    people[2].name = "Charlie";
    people[2].age = 35;

    // 输出数组元素
    for (int i = 0; i < 3; i++) {
        cout << "Name: " << people[i].name << ", Age: " << people[i].age << endl;
    }

    // 释放动态分配的内存
    delete[] people;

    return 0;
}
```

### 输出：

```
Name: Alice, Age: 25
Name: Bob, Age: 30
Name: Charlie, Age: 35
```

在这个示例中，`people` 是动态分配的结构体数组。通过 `delete[]` 释放内存，避免内存泄漏。

## 小结

* 结构体数组用于存储多个结构体对象，可以通过索引访问。
* 结构体指针用于动态访问和操作结构体对象，使用箭头运算符访问成员。
* 结构体数组与指针可以结合使用，通过指针遍历数组中的元素。
* 使用动态内存分配可以根据需要动态创建结构体数组，减少内存浪费。

掌握结构体数组和指针的使用，可以在开发中更灵活地管理和操作数据。
