指標(Pointer)是程式設計中用來儲存記憶體位址的特殊變數類型,能直接操作記憶體位置、實現動態記憶體配置、參考傳遞與高效資料結構。它像「記憶體的門牌號碼」,透過解參考運算子 * 存取位址內的值,是 C/C++ 語言的核心特性,也是理解記憶體管理與效能優化的基礎概念。
指標的基本概念與語法
記憶體三要素:
變數名稱:a(人類可讀名稱)
記憶體位址:&a(實際儲存位置,如 0x7fff5fbff6ac)
變數值:a(儲存內容,如 42)
指標宣告:
int a = 42; // 普通整數變數
int *p = &a; // 指標變數,儲存 a 的位址
int value = *p; // 解參考:取得 p 指向位址的值(42)
指標運算子:
-
&取址運算子:取得變數位址 -
*解參考運算子:透過位址存取值 -
*指標宣告:定義指標類型
指標運作原理與記憶體圖解
記憶體布局:
[0x100] [0x104] [0x108] [0x10c]
42 10 ? ?
↑ ↑
&a &b p → 0x100 *p → 42
完整範例:
#include <stdio.h>
int main() {
int a = 42;
int b = 100;
int *p = &a; // p 指向 a
printf("a 值: %d
", a); // 42
printf("a 位址: %p
", &a); // 0x7fff5fbff6ac
printf("p 值(位址): %p
", p); // 0x7fff5fbff6ac
printf("p 指向值: %d
", *p); // 42
*p = 99; // 透過指標修改 a
printf("修改後 a: %d
", a); // 99
p = &b; // p 指向 b
printf("p 新值: %d
", *p); // 100
return 0;
}
指標算術運算
指標支援 +、-、++、--,自動按資料型態大小移動:
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr; // p = &arr[0]
p + 1 // 移動到 arr[1],位址 + sizeof(int) = +4 bytes
*p + 1 // arr[0] 的值 + 1 = 11
*(p + 1) // arr[1] 的值 = 20
陣列與指標等價:
int arr[3] = {1, 2, 3};
int *p = arr;
arr[0] == *p // 1
arr[1] == *(p + 1) // 2
arr[2] == *(arr + 2) // 3
指標的實際應用場景
1. 函式參數傳遞(避免複製)
// 傳值:無法修改原變數
void swap_int(int x, int y) {
int temp = x; x = y; y = temp;
}
// 傳指標:可修改原變數
void swap_int(int *x, int *y) {
int temp = *x; *x = *y; *y = temp;
}
int main() {
int a = 1, b = 2;
swap_int(&a, &b); // 傳位址
printf("%d %d
", a, b); // 2 1
}
2. 動態記憶體配置
#include <stdlib.h>
int *create_array(int size) {
int *arr = malloc(size * sizeof(int)); // 配置記憶體
for (int i = 0; i < size; i++) {
arr[i] = i * 10;
}
return arr;
}
int main() {
int *numbers = create_array(5);
printf("%d
", numbers[2]); // 20
free(numbers); // 釋放記憶體
return 0;
}
3. 字串處理
char *str = "Hello";
char *p = str;
while (*p != '