换位函数使奇数位数组中间变0问题

文章讨论了《深入理解计算机系统》中换位函数inplace_swap的工作原理,以及如何使用该函数实现数组头尾对调的reverse_array函数。当数组元素个数为奇数时,中间元素会变为0,原因是换位函数的特殊性质。错误解法是忽略了指针指向相同地址的情况,而正确的解决方案是修改循环条件为first<last。
摘要由CSDN通过智能技术生成

参照《深入理解计算机系统》第二章例题2.10-2.11。

换位函数 inplace_swap函数:

void inplace_swap(int *x,int *y){
*y=*x^*y;
*x=*x^*y;
*y=*x^*y;
}

 可以理解到对于变量a,有a^a=0。

例如:

步骤*x*y
初值ab
第一步aa^b
第二步a^(a^b)=ba^b
第三步bb^(a^b)=a

 数组头尾对调函数:

void reverse_array(int a[],int cnt) {

int first,last;
for(first=0,last=cnt-1;
first<=last;
first++;last--;)
inplace_swap(&a[first],&a[last]);

}

函数作用很简单,就是将数组头和尾对调。数组元素个数是偶数没有任何问题,但是数组元素个数是奇数你会发现最中间那个元素的值会是0;比如数组a={1,2,3,4,5};经过对调后a={5,4,0,2,1}。

因为first和last在循环的最后一次是相等的: first=last

错误解法:

我开始的错误解法是这样的,既然相等我直接*x=*y=a   列一下:

步骤*x*y
初值aa
第一步aa^a=0
第二步a^0=a0
第三步aa^0=a

 发现没根本不为0啊?

正确解法:

哈哈,这就是地址的相关问题。

上面我只考虑*x和*y指向地址的值相等,忽略了*x和*y指向的是同一地址

当*x和*y指向同一地址时,有*y=*x^*y=0  ,*x=*y=0

步骤*x*y
初值aa
第一步0a^a=0
第二步00
第三步00

使换位后的中位不变0的解决方法:

将函数reverse_array代码first<=last;改为first<last;就行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值