参照《深入理解计算机系统》第二章例题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 |
初值 | a | b |
第一步 | a | a^b |
第二步 | a^(a^b)=b | a^b |
第三步 | b | b^(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 |
初值 | a | a |
第一步 | a | a^a=0 |
第二步 | a^0=a | 0 |
第三步 | a | a^0=a |
发现没根本不为0啊?
正确解法:
哈哈,这就是地址的相关问题。
上面我只考虑*x和*y指向地址的值相等,忽略了*x和*y指向的是同一地址
当*x和*y指向同一地址时,有*y=*x^*y=0 ,*x=*y=0
步骤 | *x | *y |
初值 | a | a |
第一步 | 0 | a^a=0 |
第二步 | 0 | 0 |
第三步 | 0 | 0 |
使换位后的中位不变0的解决方法:
将函数reverse_array代码first<=last;改为first<last;就行。