c/c++向函数传递指针并修改其指向的问题

一个用来交换两个数的值的函数,众所周知的错误写法为:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. void swap(int a, int b)  
  5. {  
  6.     int t = a;  
  7.     a = b;  
  8.     b = t;  
  9. }  
  10.   
  11. int main()  
  12. {  
  13.     int a, b;  
  14.     cin >> a >> b;  
  15.     swap(a, b);  
  16.     cout<< a << " "<< b;  
  17. }  


因为向函数中传递的只是a和b的拷贝,在函数执行结束后其中的a和b的值会被释放,并不会影响调用者中a和b原有的值(即值传递的方法)。

  

一种正确的写法为:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. void swap(int *p1, int *p2)  
  5. {  
  6.     int p;  
  7.     p = *p1;  
  8.     *p1 = *p2;  
  9.     *p2 = p;  
  10.       
  11. }  
  12.   
  13. int main()  
  14. {  
  15.     int a, b;  
  16.     int *p, *q;  
  17.     cin >> a >> b;  
  18.     p = &a;  
  19.     q = &b;  
  20.       
  21.     swap(p, q);  
  22.     cout<< a << " "<< b;  
  23. }  

这里由于使用了指针传递,具体过程为:

函数执行前:


函数执行后:


可以看到,该种方法向函数传递了指向a和b的两个指针,通过直接改变值a和b所在地址中的值的方法达到了交换值的目的。 但该种方法并未改变指针的指向。

而如果想要通过改变指针指向的方法来达到交换值的目的,一种想法是把swap函数修改为:
[cpp]  view plain  copy
  1. void swap(int *p1, int *p2)  
  2. {  
  3.     int *p;  
  4.     p = p1;  
  5.     p1 = p2;  
  6.     p2 = p;  
  7. }  

方法看似很正确,但是很遗憾,执行完swap函数后a和b的值其实并没有更改。 这是因为swap函数在接受两个指针作为参数时,会为两个指针p q创建一份形参拷贝即p1 q1。
函数执行前:


函数执行后:


可以看到,swap函数只改变了两个形参的指向,并未对调用者的指针p q造成影响,这与第一种值传递的方法其实是一样的,只不过这里改变的是指针的值(即指针内存储的地址的值)。

而如果想要在函数内修改指针的指向,并同时影响到调用者的指针,应该向函数传递二级指针(指针的指针):
[cpp]  view plain  copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. void swap(int **p1, int **p2)  
  5. {  
  6.     int *p;  
  7.     p = *p1;  
  8.     *p1 = *p2;  
  9.     *p2 = p;  
  10. }  
  11.   
  12. int main()  
  13. {  
  14.     int a, b;  
  15.     int *p, *q;  
  16.     cin >> a >> b;  
  17.     p = &a;  
  18.     q = &b;  
  19.       
  20.     swap(&p, &q);  
  21.     cout<< *p << " "<< *q;  
  22. }  



这里向函数传递了p q两个指针的地址, swap函数用两个二级指针形参p1 p2来接收。
函数执行前:


函数执行后:


在该函数中,进行交换的为*p1和*p2,即p和q中的值,也就是a和b两个整数的地址。达到了修改指针的指向从而交换值的目的。

例子非常简单易懂,但值得反思的是,在使用指针时一定要小心谨慎。尤其是不能被平时使用指针的思维惯性影响,以为向函数传了指针,在函数内进行修改时,调用者的值就一定会被修改,要真正理解传递进函数的形参是谁,修改的值又是谁。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值