C&C++ 指针核心惯用方法

 

1. 空指针检查

使用指针前必须判空,避免野指针访问崩溃,C++11 起推荐用  nullptr  替代  NULL 。

 

void func(int* p) {

    if (p == nullptr) return; // 空指针保护

    *p = 10;

}

 

2. 动态内存管理(C 风格)

 

- 用  malloc/calloc/realloc  分配内存, free  释放,配对使用防止内存泄漏。

-  calloc  会初始化内存为 0, realloc  可调整已分配内存大小。

 

int* arr = (int*)malloc(5 * sizeof(int));

if (arr == nullptr) { /* 内存分配失败处理 */ }

free(arr); // 释放后建议置空:arr = nullptr;

 

3. 数组与指针等价性

数组名本质是指向首元素的常量指针, arr[i]  等价于  *(arr + i) ,常用于遍历数组。

 

int arr[3] = {1,2,3};

int* p = arr; // 无需取地址符 &

for (int i = 0; i < 3; i++) {

    printf("%d ", *(p + i)); // 输出 1 2 3

}

 

4. 指针参数传递(修改实参)

通过指针传参实现“输出型参数”,直接修改函数外部变量的值。

 

void swap(int* a, int* b) {

    int temp = *a;

    *a = *b;

    *b = temp;

}

// 调用:int x=1,y=2; swap(&x,&y);

 

5. 函数指针(回调函数)

指向函数的指针,用于实现回调、动态函数映射,格式为  返回值类型 (*指针名)(参数列表) 。

 

int add(int a, int b) { return a + b; }

int main() {

    int (*func_ptr)(int, int) = add;

    printf("%d", func_ptr(2,3)); // 输出 5

}

 

6. C++ 智能指针(替代裸指针,避免内存泄漏)

C++11 引入,自动管理内存,优先使用而非裸指针:

 

-  std::unique_ptr :独占所有权,不可拷贝,支持移动。

-  std::shared_ptr :共享所有权,通过引用计数管理。

-  std::weak_ptr :解决  shared_ptr  循环引用问题。

 

#include <memory>

std::unique_ptr<int> up(new int(10));

// 无需手动释放,超出作用域自动析构

 

7. 指针常量与常量指针(C++ 常性控制)

 

- 常量指针: const int* p  → 指针指向的内容不可修改,指针本身可指向其他地址。

- 指针常量: int* const p  → 指针本身不可修改,指向的内容可修改。

- 常指针常量: const int* const p  → 指针和指向的内容都不可修改。

 

关键注意事项

 

- 避免野指针:未初始化、已释放、越界的指针,使用前务必校验。

- 杜绝内存泄漏:动态分配的内存必须对应释放,C++ 优先用智能指针。

- C++ 中尽量用引用替代指针(更安全),仅在需要空值、动态分配时使用指针。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐