# 指针变量

URL: https://caijiao.org/cpp/function/pointers
Source: docs/cpp/function/pointers.md
Description: 本节将介绍 C++ 中的指针变量，学习如何声明和使用指针，了解指针的基本操作和常见的指针应用场景。

指针是 C++ 中一种非常强大的功能，它允许程序直接操作内存。通过指针，程序可以动态分配内存、访问和修改其他变量的值，以及实现更高效的内存管理。在 C++ 中，指针用于引用内存中的地址，指向变量或对象的位置。

## 指针的声明与初始化

指针变量是用来存储其他变量的内存地址的。声明指针时，必须使用 `*` 来表示它是一个指针类型。

### 示例：指针的声明与初始化

```cpp
#include <iostream>
using namespace std;

int main() {
    int num = 10;
    int* ptr = &num;  // 声明一个指针并初始化为 num 的地址

    cout << "num 的值: " << num << endl;
    cout << "ptr 指向的地址: " << ptr << endl;
    cout << "ptr 指向的值: " << *ptr << endl;

    return 0;
}
````

### 输出：

```
num 的值: 10
ptr 指向的地址: 0x7ffeefbff59c
ptr 指向的值: 10
```

在上述代码中：

* `int* ptr` 声明了一个指向整数类型的指针变量。
* `ptr = &num` 将指针 `ptr` 初始化为变量 `num` 的地址。
* `*ptr` 解引用指针，获取它指向地址中的值。

## 指针的基本操作

### 获取变量的地址

使用取地址运算符 `&` 获取变量的地址。

```cpp
int num = 5;
int* ptr = &num; // 获取 num 的地址
```

### 解引用指针

解引用操作符 `*` 用于访问指针指向的值。

```cpp
int num = 5;
int* ptr = &num;
cout << *ptr;  // 输出 num 的值，即 5
```

### 修改指针指向的值

通过解引用指针，你可以修改它指向的变量的值。

```cpp
int num = 5;
int* ptr = &num;

*ptr = 10; // 修改 num 的值
cout << "num 的新值: " << num << endl;  // 输出: num 的新值: 10
```

## 空指针与野指针

### 空指针

空指针是指指向空地址的指针，通常用 `nullptr` 初始化。

```cpp
int* ptr = nullptr;  // 空指针
```

使用空指针可以防止指针未初始化而访问无效的内存地址。

### 野指针

野指针是指指向已经释放的内存地址的指针。使用野指针会导致程序崩溃或产生未定义行为。使用后必须确保将其指向 `nullptr` 或有效地址。

```cpp
int* ptr = new int(5);
delete ptr;  // 释放内存
ptr = nullptr;  // 防止野指针
```

## 指针与数组

在 C++ 中，数组的名字本质上是指向数组首元素的指针。可以通过指针访问数组中的元素。

### 示例：指针与数组的关系

```cpp
#include <iostream>
using namespace std;

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int* ptr = arr;  // 数组名即为数组的首地址

    cout << "通过指针访问数组元素: " << endl;
    for (int i = 0; i < 5; i++) {
        cout << *(ptr + i) << " ";  // 使用指针访问元素
    }
    cout << endl;

    return 0;
}
```

### 输出：

```
通过指针访问数组元素: 
10 20 30 40 50
```

通过 `ptr + i` 可以访问数组中的每个元素。

## 指针与函数

### 通过指针传递参数

通过指针传递参数时，函数接收到的是变量的地址，因此可以在函数内部修改原始数据。

```cpp
#include <iostream>
using namespace std;

void modifyValue(int* ptr) {
    *ptr = 20;  // 修改指针指向的值
}

int main() {
    int num = 10;
    cout << "修改前: " << num << endl;
    
    modifyValue(&num);  // 传递变量地址给函数
    cout << "修改后: " << num << endl;

    return 0;
}
```

### 输出：

```
修改前: 10
修改后: 20
```

## 动态内存分配

C++ 中提供了 `new` 和 `delete` 操作符用于动态内存分配和释放内存。

### 示例：使用 `new` 和 `delete`

```cpp
#include <iostream>
using namespace std;

int main() {
    int* ptr = new int;  // 使用 new 操作符分配内存
    *ptr = 50;

    cout << "动态分配的值: " << *ptr << endl;

    delete ptr;  // 使用 delete 释放内存

    return 0;
}
```

### 输出：

```
动态分配的值: 50
```

## 小结

* 指针是 C++ 中非常强大的功能，允许直接操作内存。
* `*` 运算符用于解引用指针，`&` 运算符用于获取变量的地址。
* 空指针（`nullptr`）和野指针是需要特别注意的概念，空指针避免无效访问，野指针需要及时置为 `nullptr`。
* 指针在数组、函数参数传递和动态内存管理中有广泛应用。

通过掌握指针的使用，你可以实现更高效的内存管理和更灵活的程序设计。
