【C++ 函数参数】指针类型和指针引用类型的区别

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:C++专栏
  • 💥 标题:【C++ 函数参数】指针类型和指针引用类型的区别
  • ❣️ 寄语:人生的意义或许可以发挥自己全部的潜力,所以加油吧!
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正

0 引言

在学习过程中发现对指针类型还有指针引用类型还是不熟练,今天再回顾总结一下。

1 参数是指针类型

看下面这段代码,函数参数是指针,在我们以前的记忆中指针传递就是可以改变实参的值。但是这个“值”改变的是指针本身的地址呢?还是指针指向的数据呢?

void fun(int* p)
{
    cout << "3: p address = " << &p << endl;
    cout << "4: p value = " << *p << endl;
}

int main() {
    int* a = new int(2);
    cout << "1: a address = " << &a << endl;
    cout << "2: a value = " << *a << endl;

    fun(a);
    return 0;
}

输出结果如下:可以发现实参a的地址和形参p的地址是不同的,也就是说这是两个指针,但是他们俩的值是相同的,那么我在函数中修改指针p所指向的值,会影响实参a所指向的值吗? 会改变

1: a address = 000000A5DEBAFA48
2: a value = 2
3: p address = 000000A5DEBAFA20
4: p value = 2

看下面这段代码的运行结果

在这里插入图片描述

在 C++ 中,当你将指针作为参数传递给函数时,指针本身的地址是被拷贝传递的。这意味着在传递指针时,传递的是指针所指向内存地址的副本,而不是整个内存块的拷贝。

所以,在这种情况下,并不会发生整个内存块的拷贝,而只是将指针本身的值(即指向的内存地址)复制给函数参数。因此,传递指针参数时,只会有4个字节的拷贝(对于32位系统)。

但是,这并不意味着函数参数的指针本身和实参的指针地址是相同的。实参的指针地址是指向内存中某个特定位置的地址,而函数参数的指针是实参指针的副本,它在内存中的位置是独立的,虽然它们都指向相同的内存地址。因此,虽然指针所指向的值是相同的,但指针本身在内存中的地址是不同的。


值得注意的是,我们刚才打印的都是指针本身的地址,而不是指针指向的地址。 如下所示

  1. cout << "1: a point address = " << a << endl; 输出的是指针本身的地址
  2. cout << "2: a address = " << &a << endl; 输出的是指针指向的地址

在这里插入图片描述


也就是说使用指针传递,如果改变函数参数指针本身的地址,是不会影响实参指针本身的地址的。同时连实参指向的值也改变不了。

代码如下:可以发现函数中的指针p重新指向了一个新地址后,并没有影响a的指向和a本身的地址。
在这里插入图片描述

2 参数是指针的引用

如果参数是指针的引用类型呢?其实就是给指针取了一个别名

代码如下:使用指针的引用传递,不仅指针指向的地址是相同的,而且指针本身的地址也是相同的。
在这里插入图片描述

如果此时在函数中修改了p指向的地址,也会影响a指向的地址,代码如下:
在这里插入图片描述

如果不使用指针引用传递的话,就不会修改a指向的地址,代码如下:
在这里插入图片描述

3 总结

总体来说指针的引用类型传递参数没太大用处。函数中通过 *p 修改指向的地址的值就可以。

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值