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 的值。

(注:本教程仅覆盖一级指针,二级指针、指针数组等进阶内容可后续学习。)

Xiaoye