关于指针的值与指针的指向

1,   swap(p1,p2)  
      int   *p1,*p2;  
      {  
        int   p;  
        p=*p1;  
        *p1=*p2;  
        *p2=p;  
      }  
       
    2。   swap   (p1,p2)  
      int   *p1,*p2;  
  {  
   
      int   *p;  
      p=p1;  
      p1=p2;  
      p2=p;  
  }  
         
   
  这两个函数1一个改变指向的值,2一个改变地址的值,  
    现在有点不是很清楚,2中改变了地址的值后,形参指向也改变了,为什么不改变实参的指向,为什么??1中改变了形参的指向,实参的指向就改变了,  
    能不能更清楚一点,我知道是单向的“值传递”方式,想知道为什么?

 

 

 

 

问题解析:

在函数内部并不会对p1和p2作任何的操作。。。  
  首先,编译器总是要为函数的每个参数制作临时副本,假设指针参数p1,p2的副本是   _p1,_p2,编译器使   _p1   =   p1,_p2=p2。  
  然后,函数内部的代码:  
  第二个函数  
  {  
      int   *p;  
      p=p1;  
      p1=p2;  
      p2=p;  
  }  
  实际上等于执行了:  
  {  
      int   *p;  
      p=_p1;  
      _p1=_p2;  
      _p2=p;  
  }  
  因此p1和p2的指向根本没发生过变化。  
  而第一个函数相当于执行了  
  {  
        int   p;  
        p=*_p1;  
        *_p1=*_p2;  
        *_p2=p;  
  }  
  由于p1和_p1,p2和_p2都是指向通一个内存地址,因此*_p1改变了,*p1也同样改变。  
  但要注意的是,两个函数当中实参p1和p2都没改变过指向,第一个函数改变的只是p1和p2他们指向的内存空间的值。  

 

 

看一下以下的程序:  
  #include   <iostream>  
  using   namespace   std;  
   
  void   foo(int   x)  
  {  
  x=3;  
  }  
   
  int   main()  
  {    
  int   x=5;  
  foo(x);  
  cout<<x<<endl;  
  }  
  x的值将是5而不会是3。  
  同样,2的swap函数被调用后,p1和p2的指向(也就是p1和p2的值)也不会改变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值