代碼還原
int k=7;
void f(int **s) {
int *t = &k;
*s = t; // 修改 *s(即主函數的 p)指向 k
printf("%d,%d,%d,", k, *t, *s); // 7,7,7
}
int main() {
int i=3, *p=&i, **r=&p;
f(r);
printf("%d,%d,%d\n", i, *p, **r); // 3,7,7
}
執行流程
- 主函數:`i=3`,`p=&i`,`r=&p`。
- 調用 `f(r)`:`s` 接收 `r` 的值(`p` 的地址)。
- `f` 內:`t=&k`(`k=7`),`*s = t` → **修改 `p` 的值為 `&k`**。
- `f` 打印:`k=7`,`*t=7`,`*s` 即 `p` 指向 `k` → `7`。
- 返回主函數:`p` 現指向 `k`(7),`i` 仍為 3(未被修改)。
- 主函數打印:`i=3`,`*p=7`,`**r` 即 `*p` = `7`。
關鍵點
- `*s = t` 修改的是 **一級指針 `p` 的值**(指向的地址),**不是** `i` 的值。
- `i` 的地址、值從未被改變,`p` 只是不再指向 `i`。
- 這與上一題(32196)本質相同:**函數通過二級指針修改一級指針指向,不影響原變量內存**。
記憶口訣
**二級指針傳入,修改一級指向;原變量內存不動,指針鏈路重連。**