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

C 語言函數參數傳遞:為什麼循環調用函數中 b += 1 不生效?

     編輯:程式設計綜合問答

問題代碼

int add(int a) {
    int b = 0;
    b += 1;          // 每次調用 b 都是局部變量,初始化為 0
    return b;        // 僅返回 1
}
int main() {
    for (int i = 0; i <= 5; i++) {
        printf("%d\n", add(0)); // 輸出六個 1
    }
}

核心誤區

C 語言參數傳遞是「值傳遞」。函數內部的參數與局部變量在棧幀中,函數返回後棧幀銷毀,**狀態不會保留到下一次調用**。

三種實現「累加器」的正確模式

模式代碼關鍵點適用場景
靜態局部變量static int b = 0; b += 1; return b;單函數內保持狀態,全局唯一
指針/引用參數void add(int *b) { *b += 1; } 主程序傳 &counter調用方控制生命週期,多實例互不干擾
全局/文件靜態變量static int g_counter = 0; int add() { return ++g_counter; }模塊級共享狀態,需注意線程安全

指針版本完整示例

#include 

void add(int *counter) {
    *counter = *counter + 1;
}

int main() {
    int cnt = 0;
    for (int i = 0; i <= 5; i++) {
        add(&cnt);
        printf("%d\n", cnt); // 輸出 1 2 3 4 5 6
    }
    return 0;
}

C++ 參考版本(更直觀)

void add(int &counter) { ++counter; }

總結

  • 函數內 int b = 0 每次調用都重置,**無法跨調用保持狀態**。
  • 需跨調用保持狀態時:**靜態局部變量**(簡單單例)、**指針/引用參數**(調用方管理)、**全局變量**(模塊共享)三選一。
  • 教科書多用指針演示「模擬引用傳遞」,實際工程中 C++ 首選引用,C 語言用指針。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved