在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; }
输出如下:
在程序外面,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 = # cout << *pN << endl; func(pN); cout << *pN << endl; return 0; }
输出结果
此时在函数func里,p接收了value的地址,但是并没有改变p指向的内容,此时的p = &value, 仍然是值传递,即使value生命周期是全局的也没用,因为此时用 p = &value, 修改的pN的副本,并不是pN本身。如果在开发中,中间写了很多代码,突然写一句p = &value, 那就起不到改变指针指向的内容的效果。
(3)指针的引用传参
当然如果是指针的引用那就不一样了,还是会改变指针指向的内容,代码如下:
此时的效果和(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; }
输出结果