c++指针的分类和各类指针的用法?
时间: 2025-05-28 09:23:27 AIGC 浏览: 24
### C++ 中指针的分类及其具体用法
#### 原始指针 (Raw Pointer)
原始指针是最基本的指针类型,用于存储变量或对象的内存地址。它可以直接通过 `*` 运算符访问所指向的内容。
```cpp
int value = 10;
int *ptr = &value; // ptr 是一个指向 int 类型的原始指针
std::cout << *ptr; // 输出 10
```
然而,原始指针存在一些潜在问题,比如容易引发野指针、悬空指针等问题[^3]。
---
#### void 指针 (`void*`)
`void*` 是一种通用指针类型,可以用来保存任何数据类型的地址。由于其不携带类型信息,因此无法直接解引用,必须先进行显式的类型转换。
```cpp
int num = 42;
void* vp = #
// 解引用前需强制类型转换
int* ip = static_cast<int*>(vp);
std::cout << *ip; // 输出 42
```
注意:编译器不会允许直接对 `void*` 执行解引用操作,这是为了防止因错误类型假设而导致程序崩溃[^1]。
---
#### 函数指针
函数指针用于存储函数的入口地址,可以通过该指针调用对应的函数。
```cpp
int add(int a, int b) { return a + b; }
typedef int (*FuncPtr)(int, int);
FuncPtr func = add;
std::cout << func(5, 3); // 输出 8
```
---
#### 数组指针
数组指针是指向整个数组的指针,而不是单个元素。对于多维数组的操作尤其重要。
```cpp
int arr[3][4];
int (*p)[4] = arr; // p 是指向具有 4 个整数的一维数组的指针
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 4; ++j) {
std::cout << p[i][j]; // 访问二维数组中的元素
}
}
```
当涉及指针运算时,需要注意不同维度下地址偏移量的变化规律[^2]。
---
#### 智能指针
智能指针是为了管理动态分配的对象而设计的一种 RAII(Resource Acquisition Is Initialization)工具,能够自动释放资源并减少手动管理带来的风险。
##### unique_ptr
`unique_ptr` 表示独占所有权的智能指针,同一时间只有一个 `unique_ptr` 可以拥有某个对象的所有权。
```cpp
#include <memory>
std::unique_ptr<int> uptr = std::make_unique<int>(10);
std::cout << *uptr; // 输出 10
```
一旦超出作用域,`unique_ptr` 自动销毁其所拥有的对象。
##### shared_ptr
`shared_ptr` 支持共享所有权模型,多个 `shared_ptr` 实例可以共同管理同一个对象。它的生命周期由引用计数决定。
```cpp
#include <memory>
std::shared_ptr<int> sptr1 = std::make_shared<int>(20);
std::shared_ptr<int> sptr2 = sptr1; // 引用计数加 1
if (sptr1.use_count() == 2) {
std::cout << "Reference count is 2"; // 输出 Reference count is 2
}
sptr1.reset(); // 引用计数减 1
if (!sptr2.unique()) {
std::cout << "Still not the only owner";
} else {
std::cout << "Now the only owner";
}
```
##### weak_ptr
`weak_ptr` 不增加引用计数,通常作为辅助手段配合 `shared_ptr` 使用,避免循环引用问题。
```cpp
#include <memory>
std::shared_ptr<int> sptr = std::make_shared<int>(30);
std::weak_ptr<int> wptr = sptr;
if (wptr.expired()) {
std::cout << "Object no longer exists";
} else {
std::shared_ptr<int> temp = wptr.lock();
std::cout << *temp; // 如果对象仍然有效,则输出 30
}
```
自 C++11 起推荐使用这些现代智能指针替代传统的原始指针来处理动态内存管理[^3]。
---
阅读全文
相关推荐


















