如何在C++中正确地使用和操作指针?

C++指针正确使用与操作(精简完整版)

一、指针基础定义

指针是存储变量内存地址 的变量,格式:类型* 指针名

cpp 复制代码
int a = 10;
int* p = &a; // &取地址,p存放a的地址
*p = 20;     // *解引用,修改地址对应的值

二、核心基础操作

  1. & 取地址:获取变量内存地址
  2. *** 解引用**:通过地址访问对应数据
  3. 赋值:同类型指针才能互相赋值

三、各类指针规范用法

1. 普通变量指针

cpp 复制代码
int num = 5;
int* ptr = #
cout << *ptr; // 输出5

2. 数组指针

数组名本质首元素地址,无需加&

cpp 复制代码
int arr[3] = {1,2,3};
int* p = arr;
*(p+1) = 99; // 修改第二个元素

3. 函数指针

存储函数地址,用于回调

cpp 复制代码
void test(){}
void (*fp)() = test;
fp(); // 调用函数

4. const指针(三种,极易踩坑)

  1. const int* p:指针可改,指向的值不可改
  2. int* const p:指针本身地址固定,值可改
  3. const int* const p:地址、值全都不能修改

5. 二级指针 int** p

存放一级指针的地址,多用于动态数组、函数修改外部指针

四、动态内存 new / delete(重点规范)

单个变量

cpp 复制代码
int* p = new int(100); // 开辟堆内存
delete p;              // 释放内存
p = nullptr;           // 置空,防止野指针

数组

cpp 复制代码
int* arr = new int[5];
delete[] arr; // 数组必须加[]释放
arr = nullptr;

规则:

  • new 必须配对 delete,否则内存泄漏
  • 释放后立刻赋值 nullptr,杜绝野指针

五、安全使用准则(避坑核心)

  1. 禁止野指针

    未初始化、已释放的指针都是野指针,访问直接崩溃。

    定义时直接初始化:int* p = nullptr;

  2. 不要返回局部变量地址

    局部变量存栈,函数结束自动销毁,返回地址会失效。

    cpp 复制代码
    int* badFunc(){
        int x=1;
        return &x; // 错误!
    }
  3. 指针越界禁止访问

    数组指针 p+n 不能超出数组长度,会篡改其他内存。

  4. 不同类型指针禁止随意强转

    类型不匹配会造成取值错乱。

  5. 空指针判断

    使用前先判断:if(p != nullptr),避免空指针崩溃。

  6. 堆内存谁开辟谁释放

    new和delete成对,不重复释放同一块内存。

六、C++现代替代方案(优先推荐)

尽量少用裸指针,用智能指针自动管理内存,无需手动delete:

  • unique_ptr:独占资源,性能高
  • shared_ptr:共享资源,计数回收
cpp 复制代码
#include <memory>
unique_ptr<int> p = make_unique<int>(10);
// 自动释放,不用delete

配套标题可选

  1. C++指针完整使用规范与避坑指南
  2. 一文吃透C++指针操作、内存管理
  3. C++裸指针安全使用全套教程
  4. C++指针从基础到智能指针实战