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

C++ 指標核心概念圖解:地址、解引用、指標自身位址一次搞懂

     編輯:關於C++

一張圖理解指標三要素

指標運行結果示意圖

核心定義

  • 指標:儲存變數記憶體地址的變數。
  • & (取址運算子):取得變數在記憶體中的位址。
  • * (間接運算子/解引用):在宣告時表示「這是指標」;在使用時表示「取得該地址儲存的值」。

最小化完整範例

#include 
using namespace std;

int main() {
    int i = 5;           // 普通整數變數
    int *p = &i;         // 指標 p 保存 i 的地址

    cout << "變數 i 的值: " << i << endl;
    cout << "指標 p 指向的值 (*p): " << *p << endl;
    cout << "指標 p 保存的地址 (p): " << p << endl;
    cout << "指標 p 自身的地址 (&p): " << &p << endl;

    return 0;
}

輸出結果對照(記憶體位址每次運行不同)

輸出項目範例值含義
i 的值5變數本身的值
*p5p 指向的記憶體內容 = i 的值
p0x7ffd... (某十六進制位址)i 在記憶體中的位置
&p0x7ffd... (另一十六進制位址)指標變數 p 自己在記憶體中的位置

進階延伸:指標的指標、const 修飾、陣列退化

int **pp = &p;        // 指向指標的指標
int *const q = &i;    // q 本身不可改 (常量指標)
const int *r = &i;    // *r 不可改 (指向常量的指標)
const int *const s = &i; // 兩者皆不可改

int arr[3] = {1,2,3};
int *pa = arr;        // 陣列名退化為首元素地址
// pa[0] == arr[0], *(pa+1) == arr[1]

常見錯誤與避坑

  1. 野指標:宣告未初始化 → 解引用崩潰。
    int *p; *p = 10; // 錯誤 → int *p = nullptr; 或初始化指向合法記憶體。
  2. 懸空指標:delete p; ... *p = 5; 釋放後仍使用。
    對策:delete p; p = nullptr;
  3. 類型不匹配:int *p = (int*)malloc(sizeof(double)); 存取越界/對齊問題。
  4. 指標運算誤區:p + 1 移動 sizeof(*p) 位元組,非 1 位元組。

現代 C++ 最佳實踐

  • 優先使用 智慧指標:std::unique_ptr、std::shared_ptr,RAII 自動管理生命週期。
  • 避免裸 new/delete,改用 std::make_unique/make_shared。
  • 參數傳遞偏好 引用 (T&) 或 const 引用 (const T&),非拥有語義勿用指標。
  • nullptr 取代 NULL/0,型別安全。

結語

指標是 C/C++ 靈活與危險的雙面刃。徹底理解「地址、值、指標自身位址」三者關係,配合現代智慧指標與 RAII,即能在享受效能優勢的同時,將記憶體錯誤降至最低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved