Pointer 指標
## C 語言 Pointer(指標)基礎概念
指標是一種**儲存記憶體位址的變數**。透過指標,可以間接存取或修改其他變數的內容。
### 1. 取得變數位址:`&`
```c
int number = 10;
printf("%p", &number);
```
`&number` 表示取得 `number` 的記憶體位址。
### 2. 宣告指標
```c
int *ptr;
```
表示 `ptr` 是一個「指向 `int` 型態資料」的指標。
不同資料型態通常要使用相對應的指標型態:
```c
int *int_ptr;
char *char_ptr;
float *float_ptr;
double *double_ptr;
```
### 3. 透過指標取得資料:`*`
```c
int number = 10;
int *ptr = &number;
printf("%d\n", *ptr); // 取得 number 的值:10
```
`*ptr` 稱為**解參照(dereference)**,表示取得指標所指向位址中的資料。
也可以透過指標修改原本的變數:
```c
*ptr = 20;
```
此時 `number` 的值也會變成 `20`。
> 注意:指標使用前應先指向有效的變數,或設定為 `NULL`,不要任意使用未初始化的指標。
---
## 範例一:使用 `int` 指標讀取與修改資料
```c
#include <stdio.h>
int main(void)
{
int number = 10;
int *ptr = &number;
printf("number 的值:%d\n", number);
printf("number 的位址:%p\n", &number);
printf("ptr 儲存的位址:%p\n", ptr);
printf("透過指標取得的值:%d\n", *ptr);
// 透過指標修改 number
*ptr = 25;
printf("修改後的 number:%d\n", number);
return 0;
}
```
可能輸出:
```text
number 的值:10
number 的位址:0x...
ptr 儲存的位址:0x...
透過指標取得的值:10
修改後的 number:25
```
其中:
- `&number`:取得 `number` 的位址
- `ptr`:儲存 `number` 的位址
- `*ptr`:取得或修改 `number` 的值
---
## 範例二:使用 `char` 指標處理字串
在 C 語言中,字串通常是由 `char` 陣列組成,並以 `'\0'` 表示結尾。
```c
#include <stdio.h>
int main(void)
{
char text[] = "Hello";
char *ptr = text;
printf("原本的字串:%s\n", text);
// 透過指標修改第一個字元
*ptr = 'Y';
printf("修改後的字串:%s\n", text);
// 使用指標逐一印出字元
printf("逐字元輸出:");
while (*ptr != '\0') {
printf("%c ", *ptr);
ptr++;
}
printf("\n");
return 0;
}
```
輸出結果:
```text
原本的字串:Hello
修改後的字串:Yello
逐字元輸出:Y e l l o
```
這裡的重點是:
- `char *ptr = text;`:`text` 代表陣列第一個元素的位址
- `*ptr`:取得目前指向的字元
- `ptr++`:讓指標移動到下一個字元
- `'\0'`:字串結尾標記
## 小結
| 語法 | 意義 |
|---|---|
| `int *ptr` | 宣告一個指向 `int` 的指標 |
| `&number` | 取得 `number` 的位址 |
| `*ptr` | 取得或修改指標指向的資料 |
| `ptr = &number` | 讓指標指向 `number` |
| `ptr++` | 將指標移動到下一個資料位置 |
| `NULL` | 表示指標目前不指向有效資料 |
相關學習地圖、教學課程
C 語言,系統程式