C++ 指针传参,函数内修改指针不影响实参

一、C++ 按指针传值时,遇到的问题,记录如下:

当我们使用指针传参的时候,会从实参拷贝一份对象到形参,二者是不同的指针,但是指向同一块地址。

如果在被调用函数中对参数指针进行重新指向,则不会影响到调用函数中的实参。

但是修改了指针指向的地址的内容,则会影响,如下面代码中的a->x

#include<iostream>

class A
{
    public:
    int x=0;
};

void test(A* a)
{
    a->x=10; //修改x的值,x到了函数之外也会变成10

    std::cout<< &a<<std::endl;//0x16fdff608 可以看到指针本身的地址不同,说明是两个指针
    a=0;//让a的值设为0,即a指向0 
    std::cout<< a<<std::endl; // 0x0
};

int main()
{
    A *a =new A;
    std::cout<<&a<<std::endl;//0x16fdff640
    std::cout<<a<<std::endl; //0x1002061f0
    test(a);
    std::cout<<a<<std::endl; //0x1002061f0 函数内对指针重新指向,不影响实参指针
    return 0;
}

可见,指针传值也存在复制的情况,虽然是指针,复制的开销可以忽略不计,且性能比值传参要好很多,但是依然容易出错

所以C++在此基础上引入了引用传值。

二、按引用传值时则不存在这种情况,引用传值不会出现复制的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值