首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Win32 開發入門(1):C++ 指標與記憶體管理核心觀念

     編輯:關於C++

指標其實不難:生活中的類比

指標 = 記憶體位址。生活中到處可見「指標」:

  • 指南針 → 指向方向
  • 手表指針 → 指向刻度
  • 電流/電壓表指針 → 指向數值
  • 油表指針 → 指向剩餘油量

讀取手表時間的過程:看時針指向 10-11 之間 → 10 點;分針指向第 2 格 → 10 分。指標運作邏輯相同:**透過位址找到資料**。

山寨手表指針示意

指標的三大功能

  1. 索引記憶體:透過位址存取變數
  2. 動態配置記憶體:new 配置、delete 釋放
  3. 建立陣列: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[]

動態陣列輸出

函數參數傳遞:值傳遞 vs 指標/參考傳遞

值傳遞 (預設) - 無法修改原變數


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

指標傳遞有效

參考傳遞 (C++ 特有) - 語法更直觀


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

參考傳遞有效

物件生命週期:區域物件 vs 動態物件


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 才會呼叫解構函數。

Func1 自動解構,Func2 未解構

加上 delete 後兩者都解構

結論

  • 指標本質是**儲存位址的整數**,透過位址存取資料
  • * 解參考取值,& 取得變數位址
  • new 配置記憶體,**必須配對 delete/delete[] 釋放**
  • 函數需修改呼叫端變數時,使用指標或參考傳遞
  • 動態建立物件不會自動解構,記得 delete 避免記憶體洩漏
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved