常見錯誤:將未初始化指針傳給函數,在函數內 new 分配記憶體並賦值給形參指針,返回後實參指針仍為原值(如 null)。
void testptrnoret(int* a, int n) {
a = new int[n]; // 修改的是形參副本
for (int i = 0; i < n; i++) a[i] = i;
}
int main() {
int* b = 0;
testptrnoret(b, 4); // b 仍為 0,記憶體洩漏且無法訪問
}
原因:C++ 函數參數默認值傳遞。指針作為值被複製,函數內修改指針變量本身(指向新地址)不影響外部實參。
int* testptrret(int* a, int n) {
a = new int[n];
for (int i = 0; i < n; i++) a[i] = i;
return a; // 通過返回值傳回新地址
}
int main() { int* a = testptrret(nullptr, 4); }
void testptrref(int* &a, int n) { // 引用傳遞
a = new int[n];
for (int i = 0; i < n; i++) a[i] = i;
}
void testptrptr(int** a, int n) { // 二級指針
*a = new int[n];
for (int i = 0; i < n; i++) (*a)[i] = i;
}
| 操作 | 影響外部實參? |
|---|---|
| 修改指針指向的內容 (*p = val) | ✅ 是 |
| 修改指針變量本身 (p = new_addr) | ❌ 否 (值傳遞時) |
| 傳指針引用 / 二級指針修改指針本身 | ✅ 是 |
調試時觀察指針地址變化:傳值調用前後實參指針地址不變,但函數內形參指針地址不同。理解「指針也是值」是避免此類 Bug 的關鍵。