指標 = 記憶體位址。生活中到處可見「指標」:
讀取手表時間的過程:看時針指向 10-11 之間 → 10 點;分針指向第 2 格 → 10 分。指標運作邏輯相同:**透過位址找到資料**。

new 配置、delete 釋放new int[3] 建立動態陣列
int* pint = new int(100);
printf("*pint = %d\n", *pint); // 100 (解參考取值)
printf("pint = 0x%x\n", pint); // 0x10f1968 (位址值)
delete pint; // 釋放記憶體
int* 表示指向 int 的指標,佔 4 位元組。*pint 取得指向位址的實際值。

int a = 50;
int* p = &a; // p 指向 a 的位址
*p = 250; // 透過指標修改 a 的值
printf("a = %d\n", a); // 250
指標不直接存值,存的是**位址**。透過 *p = 250 修改該位址的內容,原變數 a 同步改變。

int* arr = new int[3];
arr[0] = 20; arr[1] = 21; arr[2] = 22;
for (int i=0; i<3; i++) printf("arr[%d]=%d\n", i, arr[i]);
delete[] arr; // 陣列釋放用 delete[]

void fn(int x) { x += 100; }
int a = 20; fn(a); // a 仍為 20
參數 x 是區域副本,位址與 a 不同。


void fn(int* x) { *x += 100; }
int a = 20; fn(&a); // a 變為 120

void fn(int& x) { x += 100; }
int a = 20; fn(a); // a 變為 120

class Test {
public:
Test() { cout << "Test 建構" << endl; }
~Test() { cout << "Test 解構" << endl; }
void Do(const char* c) { cout << "在 " << c << " 呼叫 Do" << endl; }
};
void Func1() {
Test t; t.Do("Func1"); // 函數結束自動解構
}
void Func2() {
Test* pt = new Test; pt->Do("Func2"); // 未 delete,不會解構
// delete pt; // 加上這行才會解構
}
區域物件:變數生命週期結束 → 自動呼叫解構函數。
動態物件:指標變數結束只釋放指標本身,**物件本體仍在堆積區**,需手動 delete 才會呼叫解構函數。


* 解參考取值,& 取得變數位址new 配置記憶體,**必須配對 delete/delete[] 釋放**delete 避免記憶體洩漏