指標是 C/C++ 核心概念,許多演算法(如鏈結串列)皆圍繞指標設計。本文從零開始,帶你掌握指標宣告、初始化、解參考、常見陷阱與動態記憶體管理。
一般變數儲存實際資料;指標儲存資料所在的記憶體位址。指標告訴程式:「去這個位址找資料」。
int *pNumberOne; // 宣告指向 int 的指標
int *pNumberTwo;
int some_number = 10;
int some_other_number = 20;
pNumberOne = &some_number; // & 取址運算子
pNumberTwo = &some_other_number;
習慣在指標變數前加 p 前綴(如 pNumber)提升可讀性。
#include <iostream>
using namespace std;
int main() {
int nNumber = 15;
int *pPointer = &nNumber;
cout << "nNumber = " << nNumber << endl; // 15
*pPointer = 25; // 解參考:修改指標指向的記憶體內容
cout << "nNumber = " << nNumber << endl; // 25,原變數被修改
return 0;
}
*pPointer 稱為解參考,相當於直接操作 nNumber。
int *pPointer;
void SomeFunction() {
int nNumber = 25;
pPointer = &nNumber; // 指向區域變數
} // 函數結束,nNumber 被銷毀,記憶體釋放
int main() {
SomeFunction();
cout << *pPointer; // 未定義行為!存取已釋放記憶體
}
錯誤原因:區域變數生命週期隨函數結束而終止。指標指向的記憶體已無效,後續存取導致未定義行為(可能輸出垃圾值、崩潰、或看似正常但極不穩定)。
使用 new/delete(C++)或 malloc/free(C)在堆疊配置記憶體,生命週期由程式設計師手動控制。
void SomeFunction() {
pPointer = new int; // 堆疊配置
*pPointer = 25;
}
int main() {
SomeFunction();
cout << *pPointer; // 正確輸出 25
delete pPointer; // 記得釋放!
}
動態配置記憶體直到呼叫 delete 才會釋放,解決生命週期不匹配問題。
p+1 移動至下一個元素)unique_ptr, shared_ptr)自動管理生命週期掌握指標是精通 C/C++ 的關鍵門檻,建議多動手實驗、畫記憶體圖解析行為。