📘指针基础

2026-08-10
⭐⭐ GESP 6级

📖概念讲解

【考点 · 6级】指针基础 — 6级核心考点,存储变量内存地址的特殊变量。

【说人话】指针就是一个"地址牌",它不存值,存的是某个变量在内存里的门牌号。通过 * 解引用可以拿到地址对应的值,通过 & 可以获取变量的地址。指针最大的坑:野指针(未初始化的指针)和空指针解引用(nullptr)。

💻代码示例

1#include <iostream>
2using namespace std;
3
4int main() {
5 int a = 42; // 普通变量,值为42
6 int* p = &a; // p存的是a的地址(&取地址)
7 cout << "p指向的值: " << *p << endl; // *解引用,拿到a的值42
8 *p = 100; // 通过指针修改a的值,a变成100
9 cout << "a现在是: " << a << endl; // 输出100
10 int* q = nullptr; // 空指针,不指向任何地方
11 // cout << *q; // ❌ 危险!解引用空指针=崩溃
12 return 0;
13}
14// 输出: p指向的值: 42 a现在是: 100

🧩互动小测

第1题:以下哪个能正确获取变量地址?

第2题:int a = 5; int* p = &a; *p = 20; 之后a的值是?

第3题:以下关于nullptr的说法,正确的是?

🏋️动手练一练

📝 编程练习

写一个程序:定义一个函数 void swap(int* a, int* b),通过指针交换两个整数的值。
提示:函数参数要用指针,在函数内部通过解引用交换值。主函数中调用swap并输出交换后的结果。
参考答案:
#include<iostream>
using namespace std;

void swap(int* a, int* b) {  // 参数是指针类型
    int temp = *a;            // 暂存a指向的值
    *a = *b;                  // 把b指向的值赋给a指向的地址
    *b = temp;                // 把暂存的值赋给b指向的地址
}

int main() {
    int x = 10, y = 20;
    cout << "交换前: x=" << x << " y=" << y << endl;
    swap(&x, &y);             // 传入地址
    cout << "交换后: x=" << x << " y=" << y << endl;
    return 0;
}
// 输出: 交换前: x=10 y=20  交换后: x=20 y=10

要点:用指针做参数,函数内通过 *a、*b 解引用修改的是原变量的值,所以swap后x和y会交换。如果用值传递(int a, int b),函数内交换不影响外部。

📝易错点提醒

⚡ 野指针:声明指针后必须初始化,否则它指向随机内存,解引用会导致未定义行为。int* p; *p = 5; ❌ 危险!
⚡ 类型匹配:int* 只能存 int 变量的地址,存 double 地址虽然能编译但类型不匹配,容易出错。
⚡ 空指针检查:使用指针前最好判断 if (p != nullptr),防止对空指针解引用。
学完这个知识点后点一下