C++指針是什麼?零基礎快速上手基礎教程

什麼是C++指針?零基礎快速上手基礎教程

一、指針是什麼?——從“地址”說起

想象你有一個房間,房間裏放着你的玩具(比如一個整數變量)。這個房間在“內存”裏有一個唯一的“門牌號”(地址),比如0x7ffd…。指針就像是一個寫着這個門牌號的紙條,你通過這張紙條可以直接找到那個房間(變量),而不需要喊“誰的玩具在房間裏”。

在C++中,指針本質上是一個變量,它存儲的不是具體的數值,而是另一個變量在內存中的地址。就像你寫着“玩具在A房間”的紙條,這張紙條本身佔內存,但它指向的是玩具所在的位置。

二、爲什麼需要指針?——解決“直接操作內存”的問題

如果沒有指針,我們修改變量只能通過變量名(比如 a = 10;)。但指針能讓我們直接通過地址操作內存,這在以下場景很有用:

  1. 動態分配內存:比如你需要在程序運行時才確定大小的數組(比如根據用戶輸入的長度創建數組),這時候需要用 new/delete 配合指針實現。
  2. 函數傳參優化:如果傳遞大結構體或數組,直接傳變量會複製整個數據,而傳指針只複製地址,效率更高。
  3. 數組與內存的直接訪問:數組名本質上就是首元素的指針,指針能更靈活地遍歷數組。

三、指針的基本語法——四步學會使用

1. 聲明指針:指定“門牌號”的類型

指針必須明確指向哪種類型的變量(比如 intdouble),語法是:
類型* 指針變量名;
例如:
int* p;(聲明一個指向 int 類型變量的指針 p
double* q;(聲明一個指向 double 類型變量的指針 q

注意* 是指針類型的標誌,不是乘法!

2. 取地址:給指針“貼上門牌號”

要讓指針指向某個變量,必須用 取地址運算符 & 獲取變量的地址:
指針變量 = &變量名;
例如:
int a = 10;
int* p = &a;p 現在指向 a 的地址)

3. 解引用:通過指針“找到房間裏的玩具”

要訪問指針指向的變量的值,需要用 解引用運算符 *
*指針變量 表示“指針指向的變量”。
例如:
cout << *p;(輸出 p 指向的變量 a 的值,即10)

4. 修改值:通過指針“修改玩具”

通過解引用,可以直接修改指針指向的變量的值:
*指針變量 = 新值;
例如:
*p = 20;(此時 a 的值會被修改爲20)

四、實戰示例——從代碼看指針如何工作

#include <iostream>
using namespace std;

int main() {
    // 1. 定義一個普通變量
    int a = 10;
    cout << "變量a的值:" << a << endl;  // 輸出:10

    // 2. 聲明並初始化指針,讓它指向a
    int* p = &a;  // &a 是取a的地址,把地址賦值給p

    // 3. 打印指針本身的值(即a的地址)
    cout << "指針p存儲的地址:" << p << endl;  // 類似 0x7ffd...(具體地址隨機)

    // 4. 通過解引用訪問a的值
    cout << "解引用p得到的值:" << *p << endl;  // 輸出:10

    // 5. 通過指針修改a的值
    *p = 20;
    cout << "修改後a的值:" << a << endl;  // 輸出:20(a被p間接修改了)

    return 0;
}

五、注意事項——這些坑一定要避開!

1. 指針必須“指向有效地址”

如果指針未初始化(沒有指向任何變量),直接解引用會導致“野指針”,程序可能崩潰。
錯誤示例
int* p; // p未初始化,指向未知地址
*p = 10; // 危險!修改未知內存,可能報錯

正確做法
int a = 10;
int* p = &a; // 必須先讓p指向一個已存在的變量

2. 指針類型必須匹配

指針只能指向與其類型相同的變量。比如:
double d = 3.14;
int* p = &d; // 錯誤!double*才能指向double變量

3. 空指針:暫時不指向任何變量

如果指針暫時不需要指向變量,可以賦值爲 nullptr(C++11標準),表示“空指針”。
int* p = nullptr; // p不指向任何有效地址
空指針不能解引用,否則程序崩潰。

六、指針與數組——數組名就是首元素的指針

數組名(如 arr)本質上是數組首元素的地址,因此指針可以直接訪問數組元素:

int arr[3] = {1, 2, 3};
int* p = arr; // p等價於&arr[0],即數組首元素地址

// 通過指針遍歷數組
for (int i = 0; i < 3; i++) {
    cout << p[i] << " "; // 等價於 arr[i]
}
// 輸出:1 2 3

七、總結

指針是C++中非常核心的概念,它的本質是“存儲變量地址的變量”。掌握指針的關鍵是理解:
- 地址:變量在內存中的位置編號;
- 解引用:通過 * 找到指針指向的變量;
- 避免野指針:指針必須先初始化,指向有效地址。

剛開始接觸指針可能會覺得抽象,但通過多寫簡單例子(比如用指針修改變量、遍歷數組),很快就能熟練掌握。記住:指針是C++靈活操作內存的“鑰匙”,但使用時一定要小心地址的有效性!

小練習:嘗試定義一個變量 b = 50,用指針 q 指向它,然後通過 q 修改 b 的值爲100,最後輸出 b 的值。

(注:本教程僅覆蓋一級指針,二級指針、指針數組等進階內容可後續學習。)

小夜