利用指针在函数中交换两个数的陷阱与启示(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;
}
版权声明:
作者:徐锦桐
链接:https://www.xujintong.com/2023/05/04/83/
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
作者:徐锦桐
链接:https://www.xujintong.com/2023/05/04/83/
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
THE END