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

C 語言指針參數傳遞機制實驗驗證

     編輯:關於C

核心問題

函數參數為指針時,調用者傳遞的是指針本身,還是指針的副本?

實驗代碼

#include <stdio.h>

void change1(int* d) {
    printf("address_d = %p  d = %p  *d = %d\n", (void*)&d, (void*)d, *d);
    int s = 4;
    d = &s;  // 修改形參指針指向
    printf("address_d = %p  d = %p  *d = %d\n", (void*)&d, (void*)d, *d);
}

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

int main() {
    int *p = NULL, *q = NULL;
    int a = 1;
    while (a) {
        scanf("%d", &a);
        printf("address_a = %p  a = %d\n", (void*)&a, a);
        p = &a;
        q = p;
        printf("address_p = %p  p = %p  *p = %d\n", (void*)&p, (void*)p, *p);
        printf("address_q = %p  q = %p  *q = %d\n", (void*)&q, (void*)q, *q);
        change1(q);
        printf("after change1: q = %p  *q = %d\n", (void*)q, *q);
        change2(q);
        printf("after change2: a = %d, *q = %d, *p = %d\n", a, *q, *p);
    }
    return 0;
}

關鍵觀察點

  1. change1 中 d = &s 修改的是形參副本,不影響實參 q
  2. change2 中 *e = 5 通過指針修改實參指向的內存,影響 a、*p、*q
  3. &d(形參地址)與 &q(實參地址)不同,證明傳遞的是副本

結論

  • C 語言參數傳遞本質是值傳遞
  • 指針作為參數時,傳遞的是地址值的副本
  • 函數內修改指針變量本身(如 d = ...)不影響調用者
  • 函數內通過指針修改指向的內存(如 *d = ...)會影響調用者
  • 若需在函數內修改調用者的指針變量,需傳遞指針的指針(int **)

內存圖解

調用棧:
main:          a=1 @0x7ffe...  p=@a @0x7ffe...  q=@a @0x7ffe...
change1(d):    d=@a (副本) @0x7ffe...  → d=@s (修改副本)
change2(e):    e=@a (副本) @0x7ffe...  → *e=5 (修改@a處內存)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved