C 語言函數無法直接存取呼叫者 (含 main) 的區域變數。必須透過參數傳遞或全域變數共享資料。
| 需求 | 參數型別 | 呼叫範例 | 函數內操作 |
|---|---|---|---|
| 唯讀數值 | 值傳遞 int x | func(a) | 使用 x,修改不影響 a |
| 需修改原值 | 指標傳遞 int *x | func(&a) | *x = newVal 修改 a |
| 傳遞陣列/大結構 | 指標 int arr[] / Struct *s | func(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 專案慣用模式。