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

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

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

#includeusing namespace std;

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

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

	func(pN);

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

     输出如下:

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

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

 

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

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

#includeusing 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;
}

       输出结果

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

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

 

      (3)指针的引用传参

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

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

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

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

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

#includeusing 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;
}

       输出结果

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

     

上一篇:C#使用OracleParameter操作数据库


下一篇:python3实现微信公众号文章爬取