指针是不能直接进行异或运算的,需要将指针转换成整型int或long,在Linux系统下只能是long,因为指针在win系统占4个字节,在Linux系统占6个字节。
以下为两个指针的异或运算实现指针的交换:
#include <stdio.h>
int main()
{
int *a,*b;
unsigned long aa,bb;
printf("a:%p\n", a);
printf("b:%p\n", b);
aa = (unsigned long)a; //a变量指针转换成整型
bb = (unsigned long)b; //b变量指针转换成整型
printf("\n");
aa ^= bb;
bb ^= aa; //此时bb=aa
aa ^= bb; //此时aa=bb
a = (int *)aa; //aa变量指针转换成指针类型
b = (int *)bb; //bb变量指针转换成指针类型
printf("a:%p\n", a);
printf("b:%p\n", b);
return 0;
}
在Linux 64系统中的运行结果为:
a:0x7ffc70da4cf0
b:0x4004e0
a:0x4004e0
b:0x7ffc70da4cf0
因此我们可以看到,交换两个值也不一定只能借助临时变量,异或运算也是一种选择。