什麼是C++指針?零基礎快速上手基礎教程¶
一、指針是什麼?——從“地址”說起¶
想象你有一個房間,房間裏放着你的玩具(比如一個整數變量)。這個房間在“內存”裏有一個唯一的“門牌號”(地址),比如0x7ffd…。指針就像是一個寫着這個門牌號的紙條,你通過這張紙條可以直接找到那個房間(變量),而不需要喊“誰的玩具在房間裏”。
在C++中,指針本質上是一個變量,它存儲的不是具體的數值,而是另一個變量在內存中的地址。就像你寫着“玩具在A房間”的紙條,這張紙條本身佔內存,但它指向的是玩具所在的位置。
二、爲什麼需要指針?——解決“直接操作內存”的問題¶
如果沒有指針,我們修改變量只能通過變量名(比如 a = 10;)。但指針能讓我們直接通過地址操作內存,這在以下場景很有用:
- 動態分配內存:比如你需要在程序運行時才確定大小的數組(比如根據用戶輸入的長度創建數組),這時候需要用
new/delete配合指針實現。 - 函數傳參優化:如果傳遞大結構體或數組,直接傳變量會複製整個數據,而傳指針只複製地址,效率更高。
- 數組與內存的直接訪問:數組名本質上就是首元素的指針,指針能更靈活地遍歷數組。
三、指針的基本語法——四步學會使用¶
1. 聲明指針:指定“門牌號”的類型¶
指針必須明確指向哪種類型的變量(比如 int、double),語法是:
類型* 指針變量名;
例如:
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 的值。
(注:本教程僅覆蓋一級指針,二級指針、指針數組等進階內容可後續學習。)