若要在函式內修改呼叫端變數,**必須傳遞變數位址**(指標)。
void swap(int *a, int *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
#includevoid swap(int *a, int *b); int main() { int x = 10, y = 20; printf("Before: x=%d, y=%d\n", x, y); swap(&x, &y); // 傳遞位址 printf("After: x=%d, y=%d\n", x, y); return 0; } void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; }
| 錯誤寫法 | 原因 | 正確寫法 |
|---|---|---|
| `void swap(int a, int b)` | 傳值,修改副本不影響原變數 | `void swap(int *a, int *b)` |
| `swap(x, y)` | 傳值 | `swap(&x, &y)` |
| `*a = *b; *b = *a;` | 先複製導致兩者皆為原 `b` 值 | 需暫存變數 `tmp` |
#define SWAP(a,b) do { typeof(a) tmp = a; a = b; b = tmp; } while(0)
// GNU C typeof 延伸,標準 C11 可用 _Generic 實作類型泛型宏
函式交換兩數 = **指標參數 + 暫存變數 + 解參考賦值**。這是 C 語言「模擬傳址呼叫」的最基礎模式,適用於所有型別(結構體、陣列指標等)。