在C++编程时,有时需要用指针做参数,并在调用函数后,改变指针的内容。例如下面的程序
(1)*p直接修改指向的内容
#include<iostream>
using 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;
}
输出如下:
在程序外面,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 = #
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;
}
输出结果