C++指针做形参与指针的引用做形参的区别

       在C++编程时,有时需要用指针做参数,并在调用函数后,改变指针的内容。例如下面的程序

     (1)*p直接修改指向的内容

#include<iostream>

using namespace std;

void func(int *p)
{
	*p = 456;  //修改了指针指向的值
}

int main()
{
	int num = 123;
	int* pN = &num;
	cout << *pN << "地址" << pN <<endl;

	func(pN);

	cout << *pN << "地址" << pN << endl;
	return 0;
}

     输出如下:

     在程序外面,pN地址存的值是123,经过函数func后,改变了pN的值,这样,第二次cout的结果就是456。

      如果是下面的写法,那就有问题了

    (2)在函数内部修改指针的地址

#include<iostream>

using namespace std;

void func(int *p)
{
	//*p = 456;  //修改了指针指向的值
	int value = 456;
	p = &value;
}

int main()
{
	int num = 123;
	int* pN = &num;
	cout << *pN << endl;

	func(pN);

	cout << *pN << endl;
	return 0;
}

       输出结果

        此时在函数func里,p接收了value的地址,但是并没有改变p指向的内容,此时的p = &value, 仍然是值传递,即使value生命周期是全局的也没用,因为此时用 p = &value, 修改的p的副本,并不是p本身。如果在开发中,中间写了很多代码,突然写一句p = &value, 那就起不到改变指针指向的内容的效果。

      (3)指针的引用传参

        当然如果是指针的引用那就不一样了,还是会改变指针指向的内容,代码如下:

        此时的效果和(1)是一样的,改变了p指向的内容,cout后,*p = 456. 这种写法看着有点别扭。

        一般带有引用&都会改变形参的值,C++开发如果怕内存泄漏,如果不想用指针做形参,那么可以用引用,必要的时候用指针。

       例如,最常见的两数交换的各种写法,如下

#include<iostream>

using namespace std;

void swap1(int num1, int num2)
{
	int t = num1;
	num1 = num2;
	num2 = t;
}

void swap2(int &num1, int &num2)
{
	int t = num1;
	num1 = num2;
	num2 = t;
}

void swap3(int* p1, int* p2)
{
	int t = *p1;
	*p1 = *p2;
	*p2 = t;
}

int main()
{
	int a = 100, b = 200;
	cout << "a = " << a << " , b = " << b << endl;
	swap1(a, b);
	cout << "a = " << a << " , b = " << b << endl;

	swap2(a, b);
	cout << "a = " << a << " , b = " << b << endl;

	int c = 100, d = 200;
	swap3(&c, &d);
	cout << "c = " << c << " , d = " << d << endl;

	return 0;
}

       输出结果

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

令狐掌门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值