# 指针与数组

URL: https://caijiao.org/cpp/function/pointer-array
Source: docs/cpp/function/pointer-array.md
Description: 本节将介绍 C++ 中指针与数组的关系，学习如何通过指针操作数组，以及如何使用指针遍历数组元素。

在 C++ 中，数组和指针有着密切的关系。数组的名字其实就是数组首元素的指针。因此，指针可以用来访问和操作数组的元素。理解指针与数组的关系，对于编写高效的 C++ 代码至关重要。

## 数组名是指针

在 C++ 中，数组名代表了指向数组第一个元素的指针。举个例子：

```cpp
#include <iostream>
using namespace std;

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int* ptr = arr;  // 数组名 arr 是指向数组首元素的指针

    cout << "数组的第一个元素是: " << *ptr << endl;  // 通过指针访问数组第一个元素

    return 0;
}
````

### 输出：

```
数组的第一个元素是: 10
```

这里，`arr` 实际上是指向数组第一个元素 `arr[0]` 的指针，因此 `*ptr` 就是 `arr[0]`。

## 使用指针遍历数组

可以通过指针遍历整个数组。指针在数组中自动递增，指向数组的下一个元素。

### 示例：通过指针遍历数组

```cpp
#include <iostream>
using namespace std;

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int* ptr = arr;  // 指向数组首元素

    cout << "通过指针遍历数组元素: ";
    for (int i = 0; i < 5; i++) {
        cout << *(ptr + i) << " ";  // 使用指针偏移访问元素
    }
    cout << endl;

    return 0;
}
```

### 输出：

```
通过指针遍历数组元素: 10 20 30 40 50
```

在上述代码中，通过 `*(ptr + i)` 可以访问数组中的每个元素，`ptr` 是指向数组首元素的指针。

## 指针与数组的差异

尽管数组名本质上是指向数组第一个元素的指针，但它们之间有一些细微的差别：

1. **数组名不可更改**：数组名是一个常量指针，指向固定的内存地址，无法修改。例如，`arr++` 是无效的。

2. **指针可变**：指针可以修改，指向数组中的任意元素。例如，`ptr++` 可以使指针指向数组中的下一个元素。

3. **数组与指针的存储方式不同**：数组的元素在栈上连续存储，而指针是一个变量，存储在栈或堆中，取决于其声明的位置。

## 二维数组与指针

在 C++ 中，二维数组也是数组的数组，可以通过指针访问。二维数组的指针实际上是指向数组的数组元素。

### 示例：使用指针访问二维数组

```cpp
#include <iostream>
using namespace std;

int main() {
    int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int* ptr = (int*)arr;  // 将二维数组转换为指向 int 的指针

    cout << "二维数组的元素: ";
    for (int i = 0; i < 6; i++) {
        cout << *(ptr + i) << " ";  // 通过指针遍历二维数组元素
    }
    cout << endl;

    return 0;
}
```

### 输出：

```
二维数组的元素: 1 2 3 4 5 6
```

通过将二维数组转换为 `int*` 类型指针，我们能够像一维数组一样通过指针来遍历二维数组的元素。

## 使用指针传递数组

在 C++ 中，当数组作为函数参数传递时，传递的是数组的指针。这意味着函数内部可以直接操作数组的元素。

### 示例：通过指针传递数组

```cpp
#include <iostream>
using namespace std;

void printArray(int* arr, int size) {
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    printArray(arr, 5);  // 传递数组名（即数组的指针）

    return 0;
}
```

### 输出：

```
10 20 30 40 50
```

在函数 `printArray` 中，参数 `arr` 是一个指向整数的指针，它指向数组的首元素。因此，我们可以像操作普通数组一样通过指针访问数组。

## 小结

* 数组名实际上是指向数组首元素的指针。
* 可以通过指针遍历数组并访问其元素。
* 数组名不可修改，而指针可以自由改变指向。
* 使用指针可以方便地传递数组并修改数组内容。

理解指针和数组的关系能帮助你更高效地处理内存，并在需要时利用指针对数组进行灵活的操作。
