C&C++指针的惯用方法
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++ 中尽量用引用替代指针(更安全),仅在需要空值、动态分配时使用指针。
更多推荐



所有评论(0)