指標與函式參數
在 C 語言中,函式參數預設都是**傳值(pass by value)**。若希望函式能修改呼叫端的變數,必須傳入該變數的**位址**,也就是使用 Pointer(指標)。
## 1. 不透過指標傳遞參數
傳入的是變數的副本,函式內修改參數,不會影響原本的變數。
```c
#include <stdio.h>
void add_one(int x) {
x = x + 1;
}
int main(void) {
int number = 10;
add_one(number);
printf("%d\n", number); // 仍然是 10
return 0;
}
```
`add_one(number)` 將 `number` 的值複製給 `x`,因此 `x` 和 `number` 是不同的變數。
---
## 2. 透過指標傳遞參數
傳入的是變數的位址,函式可以透過指標存取並修改原本的變數。
```c
#include <stdio.h>
void add_one(int *x) {
*x = *x + 1;
}
int main(void) {
int number = 10;
add_one(&number);
printf("%d\n", number); // 11
return 0;
}
```
說明:
- `&number`:取得 `number` 的位址
- `int *x`:宣告 `x` 是指向 `int` 的指標
- `*x`:取得指標所指向的變數內容
- `*x = *x + 1`:直接修改 `number`
## 差異整理
| 傳遞方式 | 函式取得的內容 | 能否修改呼叫端變數 |
|---|---|---|
| 不使用指標 | 變數的副本 | 不能 |
| 使用指標 | 變數的位址 | 可以 |
嚴格來說,C 語言仍然是「傳值」,即使傳遞指標時,傳入的也是**指標位址的副本**;只是透過這個位址,可以修改原本的資料。
相關學習地圖、教學課程
C 語言,系統程式