首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言指標參數傳遞實驗:指標本身是「值傳遞」

     編輯:關於C語言

核心問題

函數參數為指標時,調用者傳入的指標值會被複製(值傳遞)。函數內修改指標變數本身(指向新位址)不影響調用者的指標;但透過指標修改所指內容則會影響調用者。

實驗代碼

#include <stdio.h>

void change1(int *d) {          // 嘗試修改指標本身
    printf("in change1: &d=%p, d=%p, *d=%d\n", &d, d, *d);
    int s = 4;
    d = &s;                     // 只改區域副本
    printf("after d=&s: &d=%p, d=%p, *d=%d\n", &d, d, *d);
}

void change2(int *e) {          // 修改指向的內容
    *e = 5;
}

int main() {
    int *p = NULL, *q = NULL;
    int a = 1;
    while (a) {
        scanf("%d", &a);
        printf("&a=%p, a=%d\n", &a, a);
        p = &a; q = p;
        printf("&p=%p, p=%p, *p=%d\n", &p, p, *p);
        printf("&q=%p, q=%p, *q=%d\n", &q, q, *q);
        change1(q);
        printf("after change1: &q=%p, q=%p, *q=%d\n", &q, q, *q); // q 未變
        change2(q);
        printf("after change2: a=%d, *q=%d, *p=%d\n", a, *q, *p); // a 變為 5
    }
    return 0;
}

執行結果分析

  • change1 內 d 的位址(&d)與 main 中 &q 不同,證明是副本。
  • d = &s 只改變區域副本,返回後 q 仍指向 a。
  • change2 透過 *e = 5 修改 a 的值,main 中 a、*p、*q 同步變為 5。

圖解記憶體模型

main:          q ──────┐
                   │     ▼
                   └──► a (值 1)
change1:       d (q 的副本) ──► a
               d = &s  只改變 d 指向,不影響 q
change2:       e (q 的副本) ──► a
               *e = 5  修改 a 的值

結論

  1. C 語言只有值傳遞,指標傳遞的是位址值的副本。
  2. 若需在函數內修改指標本身(如分配記憶體並回傳),必須傳指標的指標(int **)或回傳新指標。
  3. 透過指標修改所指物件是安全且常用的模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved