指標 是儲存另一個變數記憶體位址的變數。掌握指標是 C++ 程式設計師的必修課,它簡化了許多任務,且動態記憶體配置、多型等核心機制均仰賴指標。
每個變數佔用記憶體,使用 & 取址運算子獲取位址:
int var1;
cout << &var1; // 輸出類似 0x7ffd...
指標宣告語法:型別 *指標名;。* 表示「指向...的指標」。
int *ip; // 指向 int 的指標
double *dp; // 指向 double 的指標
char *cp; // 指向 char 的指標
所有指標值本質上都是記憶體位址(十六進制整數),差別在於指向資料的型別,決定了解參考時如何解讀位元組。
ip = &var;*ip 存取指標指向的值int var = 20;
int *ip = &var;
cout << "var 值: " << var << endl; // 20
cout << "ip 位址: " << ip << endl; // 0x...
cout << "*ip 值: " << *ip << endl; // 20
| 概念 | 說明 |
|---|---|
| 空指標 | NULL 或 nullptr (C++11),表示不指向任何物件 |
| 指標算術 | ++、--、+、- 依元素大小移動位址,適用於陣列遍歷 |
| 指標與陣列 | 陣列名轉型為指向首元素指標;arr[i] 等價 *(arr+i) |
| 指標陣列 | 儲存指標的陣列,如 int *ptr[10]; |
| 指向指標的指標 | 多級間接,如 int **pp; 用於修改指標本身或動態二維陣列 |
| 傳遞指標給函數 | 模擬傳址呼叫,函數內可修改實參 |
| 函數回傳指標 | 回傳動態配置記憶體、靜態變數位址;勿回傳區域變數位址 |
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;
cout << *p << endl; // 10
p++;
cout << *p << endl; // 20
p += 2;
cout << *p << endl; // 50
指向函數的指標,用於回呼、策略模式等:
int add(int a, int b) { return a + b; }
int (*funcPtr)(int, int) = add;
cout << funcPtr(3, 4); // 7
std::unique_ptr, std::shared_ptr) 管理動態記憶體,避免記憶體洩漏。nullptr 取代 NULL/0,型別安全。observer_ptr (C++20) 或文件註釋。指標是 C++ 強大且危險的工具。理解位址、解參考、算術、與陣列/函數的關係是基礎;善用現代 C++ 設施(智慧型指標、RAII)讓指標使用更安全、更具表達力。