欢迎光临
我们一直在努力

C++基础(8): 指针类型

一、先搞懂:指针到底是什么?(零基础必看核心定义)

很多零基础同学刚接触指针就觉得难,其实是被“指针”这个名字绕晕了,咱们先抛开专业术语,用生活例子打个比方,一秒看懂本质:

把电脑内存想象成一排连续的房间,每个房间都有唯一的门牌号,这个门牌号就是内存地址;房间里存放的东西,就是我们定义的变量(比如整数、小数、字符)。

而指针,就是一个专门用来存放内存地址的变量,它不直接存数据,而是存“数据所在房间的门牌号”,通过这个门牌号,我们就能找到并操作房间里的原始数据。

核心区别:普通变量存数据,指针变量存“数据的地址”;指针本身也是变量,也有自己的内存地址,只是它的用途特殊。

举个最简单的对应关系:

  • 普通int变量 a = 10; → 相当于在门牌号0x1001的房间里放了数字10

  • 指针变量 p → 专门存放0x1001这个门牌号,不存10本身

二、指针的核心语法:零基础一步到位学会

2.1 指针的声明格式(固定写法,记牢不踩坑)

指针必须和指向的变量类型一致,不能乱匹配,声明格式如下:

数据类型 *指针变量名;
// 示例
int *p; // 整型指针:只能存放int类型变量的地址
double *pd; // 双精度浮点指针:只能存放double类型变量的地址
char *pc; // 字符指针:只能存放char类型变量的地址

关键细节:

  • 星号是指针的标志,写在数据类型和变量名中间,也可以紧贴变量名(int p 和 int *p 效果一样,推荐后者更清晰)

  • 指针类型必须和指向的变量类型匹配,比如int指针不能存float变量的地址,否则会报错

  • 刚声明的指针是野指针(没有指向有效地址),千万不要直接用,必须先赋值!

  • 2.2 两个核心运算符:取地址& + 解引用*

    指针离不开两个符号,这是零基础最容易混淆的点,单独拆分讲解:

    1. 取地址运算符 &(读:按位取地址)

    作用:获取普通变量的内存地址,放在指针里。用法:&变量名

    2. 解引用运算符 *(读:星号/解引用)

    作用:通过指针里的地址,找到原始变量,直接操作原始数据。用法:*指针变量名

    一句话区分:&是“拿地址”,*是“通过地址找数据”

    2.3 完整入门代码示例(零基础直接复制运行)

    #include <iostream>
    using namespace std;

    int main() {
    // 1. 定义普通整型变量,存实际数据
    int a = 10;
    cout << "普通变量a的值:" << a << endl;
    cout << "变量a的内存地址:" << &a << endl; // 用&取a的地址

    // 2. 定义整型指针,存放a的地址
    int *p; // 声明int指针
    p = &a; // 把a的地址赋值给指针p,p现在指向a

    // 3. 解引用指针,操作原始变量a
    cout << "指针p存放的地址:" << p << endl; // 和&a结果一样
    cout << "通过指针p解引用获取a的值:" << *p << endl; // 输出10

    // 4. 通过指针修改原始变量的值
    *p = 20; // 相当于直接修改a=20
    cout << "修改后变量a的值:" << a << endl; // 输出20

    return 0;
    }

    运行结果解析:指针p存的是a的地址,p就是a本身,修改p等同于直接改a,这就是指针的核心作用——间接操作变量。

    三、零基础必学:指针的常用场景(不用记,看懂就会)

    3.1 指针与数组(最常用,数组名就是指针)

    数组在内存中是连续存放的,数组名本质上就是指向数组首元素的常量指针,这是指针最实用的用法之一,不用记复杂语法,直接看示例:

    #include <iostream>
    using namespace std;

    int main() {
    int arr[5] = {1,2,3,4,5};
    int *p = arr; // 数组名arr就是首元素地址,不用加&

    // 通过指针遍历数组,和数组下标用法等价
    cout << "数组首元素:" << *p << endl; // 等价arr[0]
    cout << "数组第二个元素:" << *(p+1) << endl; // 等价arr[1]
    cout << "数组第三个元素:" << *(p+2) << endl; // 等价arr[2]

    // 循环遍历
    for(int i=0; i<5; i++){
    cout << *(p+i) << " ";
    }
    return 0;
    }

    3.2 指针作为函数参数(传址调用,修改原始数据)

    普通函数参数是传值,只会修改函数内的副本,原始数据不变;用指针做参数,能直接修改函数外的原始变量,这是指针的核心用途,零基础必掌握:

    #include <iostream>
    using namespace std;

    // 指针参数:传址调用
    void changeNum(int *num) {
    *num = 100; // 修改原始变量
    }

    int main() {
    int a = 10;
    changeNum(&a); // 传入a的地址
    cout << a; // 输出100,原始变量被修改
    return 0;
    }

    四、零基础避坑指南:指针最容易犯的5个错误

    这些错误是新手百分百会遇到的,提前避开少走弯路

  • 野指针问题:声明指针后没有赋值,直接解引用使用(比如int *p; *p=10;),会导致程序崩溃,解决办法:指针必须先指向有效地址再用。

  • 空指针使用:空指针是指向地址0的指针(int *p = nullptr;),解引用空指针会报错,使用前先判断if(p != nullptr)。

  • 类型不匹配:float变量的地址赋值给int指针,类型不一致会编译失败,严格保证指针类型和变量类型一致。

  • 混淆*和&的用法:声明指针时的是标志,解引用时的是操作符,&是取地址,千万不要混用。

  • 指针越界:数组指针超出数组范围访问,比如int arr[3]; int *p=arr; *(p+5),会导致程序异常。

  • 五、零基础指针核心总结(一句话记牢)

    • 指针 = 存地址的变量,&取地址,*解引用找数据

    • 指针类型必须和指向变量的类型一致

    • 指针先赋值(指向有效地址),再使用,杜绝野指针

    • 数组名就是首元素指针,指针遍历数组更灵活

    • 指针做函数参数,实现传址调用,修改原始数据

    零基础学习指针,不用一开始深究底层原理,先把语法、运算符、基础用法练熟,多写几遍入门代码,慢慢就会理解指针的灵活之处,后续再深入学习多级指针、动态内存分配就轻松了。

    赞(0)
    未经允许不得转载:171主机测评 » C++基础(8): 指针类型
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址