【力扣】283“交换0” 中 以指针为参数的交换函数
题源链接
今天在刷力扣第283题的时候遇到了一些问题,题目如下:
这一题我采用的是双指针来完成的,使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。
void swap(int* a,int* b){
int* t = a;
*a = *b;
*b = *t;
}
void moveZeroes(int* nums, int numsSize){
int left = 0;
int right = 0;
for(;right < numsSize;right++){
if(nums[right]){
swap(nums + left,nums + right);
left++;
}
}
}
但是运行的部分测试集没有通过
在检查过后怀疑是代码中用于交换数字的swap()函数写错了。
接下来测试一下
void swap(int* a,int* b){
int* t = a;
*a = *b;
*b = *t;
}
#include <stdio.h>
int main()
{
int a = 99;
int b = 66;
int* ptr_a = &a;
int* ptr_b = &b;
printf("%d\n", a);
printf("%d\n", b);
swap(ptr_a, ptr_b);
printf("%d\n", *ptr_a);
printf("%d\n", *ptr_b);
return 0;
}
运行结果
可以看到a,b的值经过swap()执行后输出的结果是66 66,说明并没有实现交换
接下来分析错误原因
可以看到赋值操作int* t = a; 意味着t 和 a指向了同一个地址,而不是创建了t的副本,这样交换没有实际意义,因为a和b的值都被赋值为t(也就是原来a的值),而不是实现了交换。
为了解决这个问题,可以修改swap()为:
void swap(int* a,int* b){
int t = *a;
*a = *b;
*b = t;
}
这样int t = a;将会创造一个新的整型变量t,将a的值赋给它,然后依次完成交换
成功改正!