目录
- 0 引言
- 1 参数是指针类型
- 2 参数是指针的引用
- 3 总结
- 🙋♂️ 作者:海码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位系统)。
但是,这并不意味着函数参数的指针本身和实参的指针地址是相同的。实参的指针地址是指向内存中某个特定位置的地址,而函数参数的指针是实参指针的副本,它在内存中的位置是独立的,虽然它们都指向相同的内存地址。因此,虽然指针所指向的值是相同的,但指针本身在内存中的地址是不同的。
值得注意的是,我们刚才打印的都是指针本身的地址,而不是指针指向的地址。 如下所示
cout << "1: a point address = " << a << endl;
输出的是指针本身的地址cout << "2: a address = " << &a << endl;
输出的是指针指向的地址
也就是说使用指针传递,如果改变函数参数指针本身的地址,是不会影响实参指针本身的地址的。同时连实参指向的值也改变不了。
代码如下:可以发现函数中的指针p重新指向了一个新地址后,并没有影响a的指向和a本身的地址。
2 参数是指针的引用
如果参数是指针的引用类型呢?其实就是给指针取了一个别名
代码如下:使用指针的引用传递,不仅指针指向的地址是相同的,而且指针本身的地址也是相同的。
如果此时在函数中修改了p指向的地址,也会影响a指向的地址,代码如下:
如果不使用指针引用传递的话,就不会修改a指向的地址,代码如下:
3 总结
总体来说指针的引用类型传递参数没太大用处。函数中通过 *p 修改指向的地址的值就可以。