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

C 語言函式參數傳遞:值傳遞 vs 指標傳遞的記憶體模型解析

     編輯:程式設計疑難解答

問題現象

函式 countSubstr(char* str, char* sub, int count) 內部修改 count,呼叫端 main 的變數仍為 0。改用 int* count 並傳 &count 後正常輸出 3。

記憶體四區模型視角

  • 棧區:函式呼叫時分配幀,存放區域變數與參數副本。函式返回即銷毀。
  • 堆區:malloc/new 動態分配,手動管理生命週期。
  • 資料區:全域/靜態變數。
  • 程式碼區:指令存放。

值傳遞(By Value)

void func(int count) {  // 參數在棧區分配新 int,複製實參值
    count = 3;           // 修改副本
}
int main() {
    int c = 0;
    func(c);             // 傳遞 c 的值 (0)
    // c 仍為 0,因 func 操作的是棧區另一塊記憶體
}

指標傳遞(模擬 By Reference)

void func(int* count) {  // 參數為指標,複製實參的位址
    *count = 3;          // 透過位址修改原變數
}
int main() {
    int c = 0;
    func(&c);            // 傳遞 c 的位址
    // c 變為 3
}

關鍵結論

C 語言只有值傳遞。若需在函式內修改實參變數,必須傳遞該變數的位址(指標)。這與「棧區銷毀」無關,純粹是「副本 vs 原始位址」的差別。

圖解記憶體

main 棧框:  c @ 0x7FFE... → 值 0
func 棧框:  count @ 0x7FFE... → 值 0 (副本)
            *count (指標版) → 0x7FFE... (指向 main 的 c)

理解此機制,即可正確選擇何時使用指標參數。

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