利用指针在函数中交换两个数的陷阱与启示(c/c++)

一开始我写这个程序感觉挺简单的,然后做完了,就发现没了。

我们先上错误的代码。

void swap1(int *a,int *b)
{
         int *p;
         p=a;
         a=b;
         b=p;
}
int main()
{
         int a=5,b=9;
         int *p1,*p2;
         p1=&a;
         p2=&b;
         swap1(p1,p2);
         printf("%d %d\n",a,b);
}

是不是好多人这么写的(手动狗头)当我们运行完了这个代码我们发现并不能交换两个数。就是我们想着交换两个变量的位置,但是出错了十八

BUG起源

起始这个BUG就是我们理解当这个形参是指针的时候有点问题。这里这个指针是copy的指针,它在函数里怎么交换,最后都会销毁的。
这里我们就是相当于copy了两个旧的指针形成了两个新的指针,新的指针和旧的指针指向相同的数据,我们交换这两个新的指针地址没啥用,最后这俩新的指针都会被销毁的。
看图说话,这里我们假设px和py是copy出来的新的指针。

解决方式1

但是我们可以通过指针间接的交换数据,就是我们虽然是copy的指针,但是这个指针还是指向的实参,可以通过新的指针交换两个数据。

#include 

void swap(int *x, int *y){

    int tmpt;
    tmpt = *x;
    *x = *y;
    *y = tmpt;

}

int main(void){

    for (int a, b; std::cout << "请输入a和b\n", std::cin >> a >> b;){

        swap(&a, &b);
        std::cout << "a = " << a << " b = " << b << std::endl;
    }

    return 0;
}

解决方式2

这是利用指针引用的方式,直接交换的两个地址,但是我还不是很明白,留个断点吧,等我明白了再来写来。

#include 
#include 

void swap(int *& lft, int *&rht){
    int *tmp = lft;
    lft = rht;
    rht = tmp;
}

int main(){

    int i = 42, j = 99;
    int *lft = &i;
    int *rht = &j;
    swap(lft, rht);
    std::cout << *lft << " " << *rht << std::endl;

    return 0;
}
THE END