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

C 語言使用者定義函數存取主程式變數:參數傳遞與全域變數

     編輯:程式設計疑難解答

核心機制

C 語言函數無法直接存取呼叫者 (含 main) 的區域變數。必須透過參數傳遞或全域變數共享資料。

標準方式:參數傳遞

需求參數型別呼叫範例函數內操作
唯讀數值值傳遞 int xfunc(a)使用 x,修改不影響 a
需修改原值指標傳遞 int *xfunc(&a)*x = newVal 修改 a
傳遞陣列/大結構指標 int arr[] / Struct *sfunc(arr) / func(&s)透過指標存取/修改原記憶體

範例:修改主程式變數

void modify(int *val) {
    *val = 20; // 透過指標修改主程式變數
}

int main() {
    int a = 10;
    printf("Before: %d\n", a); // 10
    modify(&a);                // 傳遞位址
    printf("After: %d\n", a);  // 20
    return 0;
}

替代:全域變數 (慎用)

int g_shared = 0; // 檔案作用域

void setGlobal(int v) { g_shared = v; }
int getGlobal() { return g_shared; }

int main() {
    setGlobal(42);
    printf("%d\n", getGlobal()); // 42
    return 0;
}

缺點:耦合高、難測試、執行緒不安全、命名空間污染。**僅限極簡單程式或嵌入式特定場景**。

進階:結構體封裝上下文

typedef struct { int a; float b; char *msg; } Context;

void process(Context *ctx) {
    ctx->a *= 2;
    printf("%s: %d\n", ctx->msg, ctx->a);
}

int main() {
    Context ctx = {10, 3.14, "Result"};
    process(&ctx);
    return 0;
}

將相關變數打包成結構體傳遞,兼顧模組化、擴展性、型別安全,是中大型 C 專案慣用模式。

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