首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 指針修改 *s 影響分析:與上題同源,核心在於指針值與指針地址區別

     編輯:程式設計綜合問答

代碼還原


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
}

執行流程

  1. 主函數:`i=3`,`p=&i`,`r=&p`。
  2. 調用 `f(r)`:`s` 接收 `r` 的值(`p` 的地址)。
  3. `f` 內:`t=&k`(`k=7`),`*s = t` → **修改 `p` 的值為 `&k`**。
  4. `f` 打印:`k=7`,`*t=7`,`*s` 即 `p` 指向 `k` → `7`。
  5. 返回主函數:`p` 現指向 `k`(7),`i` 仍為 3(未被修改)。
  6. 主函數打印:`i=3`,`*p=7`,`**r` 即 `*p` = `7`。

關鍵點

  • `*s = t` 修改的是 **一級指針 `p` 的值**(指向的地址),**不是** `i` 的值。
  • `i` 的地址、值從未被改變,`p` 只是不再指向 `i`。
  • 這與上一題(32196)本質相同:**函數通過二級指針修改一級指針指向,不影響原變量內存**。

記憶口訣

**二級指針傳入,修改一級指向;原變量內存不動,指針鏈路重連。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved