交换两个值得分析

来源:互联网 发布:qq透明皮肤软件下载 编辑:程序博客网 时间:2024/05/16 04:39

1、正确做法

void swap(int *x,int *y)
{
   int temp = *x;
      *x = *y;
      *y = temp;
}

void swap(int  &x,int &y)
{
   int temp = x;
     x = y;
     y = temp;
}

2、典型的错误做法

  • void swap(int *x,int *y)
    {
    int *temp = x;
    x = y;
    y = temp;
    }
  • void swap(int x,int y)
    {
    int temp = x;
    x = y;
    y = temp;
    }

分析:这里需要考虑的是函数中形参和实参的传递。

首先,如果形参是基本类型的对象,在调用到函数的时候,系统需要给形参申请空间,用实参去初始化形参。所以,此时,函数中     发生变化的是形参,不改变实参对象。


其次,如果形参是指针类型,先看一下下面的小程序

int  n = 0, i = 42;

int *p = &n;

*p = 42;     //此时,对象n的值发生变化,由0 变为42

 缘由:指针p指向对象n,*p改变的是p所指向的对象的值,即修改*p,实际修改的是n的值,故两值交换的时候,使用指针形形参可以实现正常的交换


最后,如果形参是引用类型,引用是给一个对象另起一个名字,引用赋值的语句

int  i = 0; 

int &n = i; //n是对象i的别名,对n进行操作,实际上就是对i进行操作

则,函数中操作的形参是实参的别名,改变形参也就是改变实参,故使用引用形参可实现正常的值交换





0 0
原创粉丝点击