void GetMemory(char *p) { p = new char[20]; }
void Test() {
char *str = NULL;
GetMemory(str); // 試圖分配內存
strcpy(str, "hello"); // Crash! str 仍為 NULL
}
C++ 函數參數**永遠是值傳遞**。指針作為參數時,傳遞的是**地址值的副本**。
觀察變量地址與值變化:
| 方法 | 原理 | 代碼示例 |
|---|---|---|
| 二級指針 | 傳遞指針地址,修改一級指針值 | `void GetMem(char **p) { *p = new char[20]; }` / `GetMem(&str);` |
| 引用傳遞 | C++ 引用是別名,直接修改原變量 | `void GetMem(char *&p) { p = new char[20]; }` / `GetMem(str);` |
| 返回值 | 函數返回新指針,調用者接收 | `char* GetMem() { return new char[20]; }` / `str = GetMem();` |
指針參數主要用於**修改指向的內容**(`*p = ...` 或 `p[i] = ...`),而非修改指針本身。例如:
void FillArray(int *arr, int n, int val) {
for (int i=0;i
**函數參數傳值,指針傳地址值。** 要修改實參指針,必須傳遞其二級指針、引用或用返回值。調試時觀察變量地址與值,能直觀理解副本機制。這是 C/C++ 指針編程的核心認知。