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

C語言指針與函數參數傳遞:為什麼要用指針實現 swap,內存模型圖解

     編輯:關於C語言

核心問題:C 語言只有「值傳遞」

void swap(int x, int y) 只能交換副本,**無法修改主調函數的實參**。必須傳遞變量地址,在被調函數中通過指針間接訪問並修改原內存。

標準 swap 實現與內存圖解


#include <stdio.h>

void swap(int* x, int* y) {
    int temp = *x;   // 取出 x 指向內存的值
    *x = *y;         // 將 y 指向內存的值寫入 x 指向內存
    *y = temp;       // 將暫存值寫入 y 指向內存
}

int main() {
    int m = 1, n = 2;
    printf("調用前: m=%d, n=%d\n", m, n);  // m=1, n=2
    swap(&m, &n);                           // 傳遞地址
    printf("調用後: m=%d, n=%d\n", m, n);  // m=2, n=1
    return 0;
}

內存模型逐步演示

階段main 棧幀swap 棧幀操作
調用前m: 1
n: 2
——
進入 swap同上x: &m
y: &n
temp: ?
形參接收實參地址
temp = *x同上temp: 1解引用 x 讀取 m 的值
*x = *ym: 2同上解引用 y 讀取 n 的值寫入 m
*y = tempn: 1同上寫入暫存值到 n
返回 mainm: 2, n: 1銷毀交換完成

等價展開:消除函數調用看本質


// swap(&m, &n) 內聯展開後等價於:
int* x = &m;
int* y = &n;
int temp = *x;   // temp = m
*x = *y;         // m = n
*y = temp;       // n = temp (原 m)

指針參數本質是將「值傳遞」升級為「引用傳遞」的手動實現:傳遞地址值(仍是值傳遞),但在函數內通過解引用操作原內存。

常見錯誤與修正

錯誤代碼現象原因修正
void swap(int x, int y)主調變量不變值傳遞只操作副本改為 int* x, int* y,調用傳 &a, &b
void swap(int* x, int* y) { int* t=x; x=y; y=t; }主調變量不變只交換了局部指針變量,未解引用修改內存必須 *x = *y 操作指向的內存
swap(m, n) 無取地址編譯錯誤/運行崩潰傳入整數值當指針,解引用訪問非法地址必須 swap(&m, &n)

進階:指針參數的 const 正確性

  • void func(const int* p):承諾不修改 *p 指向的數據(只讀)。
  • void func(int* const p):承諾不修改指針 p 本身(不指向別處)。
  • void func(const int* const p):雙重承諾。

良好習慣:只讀參數加 const,讓編譯器幫你檢查誤寫,文檔化接口契約。

總結

C 語言無引用語法,**指針是模擬引用的唯一標準手段**。理解 &var 取地址、*ptr 解引用、形參接收地址並在函數內解引用修改原內存,這三步串聯起來,就是 C 語言「傳遞引用」的完整鏈路。

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