C++ 复习之 指针与引用

本文探讨了C++中引用和指针在内存管理上的区别,通过实例解释了如何使用引用和指针来改变变量的值。在值传递与引用传递的对比中,展示了引用作为参数时如何实现实参与形参的直接关联,而指针则通过解引用操作间接修改原变量。同时,文章强调了等号操作符只会改变左侧值的特性,以及地址并未因函数调用而改变的事实。
摘要由CSDN通过智能技术生成

暑假到了,想复习一下本科学过的C++,顺便刷刷力扣,突然发现写了一年python被语法糖包围之后完全忘记了最神圣的语言是如何管理内存的。

先来看一段教科书里最经典的案例

int exchange(int a, int b)
{
    int p = a;
    a = b;
    b = p;
    return 0;
}

int main()
{
    
    int a = 1;
    int b = 2;
    exchange(a, b);
    
}

这段代码不会起任何作用,因为参数传递是值的copy,函数内部是新建了变量去执行操作的,当e函数结束的时候变量被释放。和原先的a,b没有任何关系。

int exchange(int &a, int &b)
{
    int p = a;
    a = b;
    b = p;
    return 0;
}

int main()
{
    
    int a = 1;
    int b = 2;
    exchange(a, b);
    
}

这样是能成功完成交换的。因为函数接受的是对象的引用。这里有一个地方我记得以前一直会搞混,容易把函数参数列表中的 int &a 理解成是a的地址,也就是说我以前的理解是这里接受的是a的地址。但是我们在main函数中调用时传入的是int 类型的数,这两者显然是不匹配的。所以我在excange内部打印:

int exchange(int &a, int &b)
{
    int p = a;
    a = b;
    b = p;
    return 0;
}

int main()
{
    
    int a = 1;
    int b = 2;
    exchange(a, b);
    cout << &a << endl<<&b<<endl;
    exchange(a, b);
    cout << &a << endl << &b << endl;
    cout << a << b;
}

得到的结果是

两个变量存放的地址并没有发生改变,改变的只是值。 

再来看一个例子。

int exchange(int *x, int *y)
{
    int p = *x;
    *x = *y;
    *y = p;
    return 0;
}

int main()
{
   
    int a = 1;
    int* aa = &a;
    int b = 2;
    int* bb = &b;
    
    cout << &aa << endl << &bb << endl;
    exchange(aa, bb);
    cout << &aa << endl << &bb << endl;
    cout << a << b << endl;
}

注意到aa bb的地址都没有发生变化(把&符号去掉他们的值也就是他们所指向的地址也没有发生变化)。因为等号只会改变等号左边的值,函数内部改变的是指针解引用之后的整形。

与之前通过引用的方式修改进行对比:

这里就可以理解为:指针和引用本质上都是对于对象的间接访问,只是在具体的实现上二者有很大的不同。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值