记录C++指针引用的用法

问题介绍:在修改项目中底层通讯协议遇到一个问题就是调用通讯协议类的启动函数会直接崩溃,把这个函数注释掉就可以正常运行,出现这个问题的原因和指针有关,借此记录一下遇到的问题。

下面我将通过以下两段代码说明这个问题:

1.使用正常指针传递参数 

#include <iostream>

class Message{
public:
    void start() {
        std::cout << "send message" << std::endl;
    }
};

// 函数接收一个指针的引用
void createNewObject(Message* meegscan) {
    meegscan = new Message();  // 分配一个新的对象
}

int main() {
    Message* meg = nullptr;

    createNewObject(meg);  // 调用函数

    if (meg != nullptr) {
        meg->start();  
    }

    delete meg;  
    return 0;
}

2.使用指针引用


#include <iostream>

class Message{
public:
    void start() {
        std::cout << "send message" << std::endl;
    }
};

// 函数接收一个指针的引用
void createNewObject(Message* &meegscan) {
    meegscan = new Message();  // 分配一个新的对象
}

int main() {
    Message* meg = nullptr;

    createNewObject(meg);  // 调用函数

    if (meg != nullptr) {
        meg->start();
    }

    delete meg;
    return 0;
}

 然后查看运行结果

这里我们明显可以发现使用指针引用成功创建了Message对象,而使用指针作为参数传递这个函数创建的Message对象为nullptr.

我出现这个问题的原因是由于第一次接触指针时候的潜意识.第一次接触指针是以交换两个数作为入门例程的,如下代码

#include <iostream>

// 函数交换两个整数的值
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5;
    int y = 10;

    std::cout << "Before swap: x = " << x << ", y = " << y << std::endl;

    // 调用 swap 函数,并传递 x 和 y 的指针
    swap(&x, &y);

    std::cout << "After swap: x = " << x << ", y = " << y << std::endl;

    return 0;
}

这个例子让我潜意识认为只要往一个函数传递指针就可以修改外面的值,但是并没有说明在函数内初始化一个指针并不能影响外部的指针值的情况,在此我通过画图讲清这个原理。告诫自己不要再犯同样错误,也向他人做提醒。

这是一个很标准的int* a = 1在内存中的位置图,如果把a作为参数传到函数中,则会直接把a指向的地址作为形参传递过去,这样就可以通过该地址对该地方的值进行修改,然而如果传递一个指向为空的地址,在此函数内部指向其他地址,会无法修改外部的指向。原因是函数内部只是修改副本指向的指针值。所以这个问题解决方法有两种,一是使用指针引用,可以在内部对外部的指向修改,另一种是返回对应的指针就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值