根本原因是传入的是指针的副本而非指针本身;函数内修改形参指针(如p = new int(42))只改变副本,不影响实参;要修改原指针变量的指向,必须传二级指针(int*)或指针引用(int&)。

用指针传参时,为什么修改没生效?
根本原因:你传的是指针的副本,不是指针本身。比如 void foo(int* p) 中,p 是形参,函数内对 p 赋新地址(如 p = new int(42))只改了副本,原指针变量不受影响。
要让调用方的指针变量被修改(比如重定向到新分配内存),必须传指针的地址:void foo(int** p),再用 *p = new int(42);或者更现代、更安全的方式:用引用传指针,即 void foo(int*& p)。
- 值传递指针 → 只能改它指向的内容(
*p = 100),不能改它自己指向哪 - 传
int**或int*&→ 才能改指针变量本身的值(即让它指向别处) - 结构体/类大对象建议始终传指针或引用,避免无谓拷贝
成员变量指针(T C::*)能跨函数共享吗?
可以,但必须和具体对象绑定后才能用。类成员指针本身不存地址,只存偏移量,脱离对象就是无效的“半成品”。
常见错误是把 int A::*ptr = &A::x 传进函数后,直接在函数里写 *ptr —— 这会编译失败,因为缺少对象上下文。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 正确做法:函数签名需带对象参数,例如
void useMemberPtr(A& obj, int A::*ptr) - 调用时:先获取成员指针(
&A::x),再连同对象一起传入 - 函数内访问:必须用
obj.*ptr或ptrObj->*ptr,不能单独解引用
环形缓冲区中读写指针怎么保证线程间同步?
裸指针(int* read_ptr, int* write_ptr)本身不带同步语义,必须配合原子操作或互斥锁。否则多个线程同时更新会导致丢失更新、越界或数据错乱。
最轻量的做法是用 std::atomic<int></int> 替代原始整型索引(不是指针),并配以 memory_order_acquire/memory_order_release 防止指令重排。
- 不要直接对指针变量做
++或赋值,而应操作其指向的索引值(如write_idx) - 模运算(
% size)必须在原子读-改-写之后进行,避免中间态被其他线程观察到 - 若用原始指针(如
char* buffer+int read_off),确保read_off和write_off是原子的
函数返回局部指针为什么危险?
返回指向栈内存的指针(比如 int* bad() { int x = 42; return &x; })是未定义行为——函数返回后,x 所在栈帧被回收,指针悬空。后续解引用可能读到垃圾值、崩溃,或看似正常实则不可靠。
真正安全的指针返回方式只有三种:
- 返回全局/静态变量地址(生命周期覆盖调用方)
- 返回堆内存地址(如
new或malloc分配),但调用方必须负责释放 - 返回智能指针(
std::unique_ptr/std::shared_ptr),自动管理生命周期
最容易被忽略的是:即使返回 const char* 字符串字面量(如 return "hello";)是安全的,但一旦涉及拼接、格式化或局部数组,就极易掉进栈指针陷阱。

















