大神求解 有关c++指针的问题

double a = 123.456, b = 456.789;
int ap, *bp;
ap = (int
)(&a);
bp = (int*)(&b);
cout << "a=" << a << "\tb=" << b << endl;
*ap = (*ap) ^ (*bp);
*bp = (*ap) ^ (*bp);
*ap = (*ap) ^ (*bp);
ap++;
bp++;
*ap = (*ap) ^ (*bp);
*bp = (*ap) ^ (*bp);
*ap = (*ap) ^ (*bp);
cout << "a=" << a << "\tb=" << b << endl;

为什么这段码可以让两个值的数值互换呢

3个回答

基本数据类型所占字节数和机器平台有关,目前主流电脑上 int 类型所占字节数为4,
double 类型所占字节数为8。

请注意题目中a, b 声明类型为double, 而ap,bp声明类型为指向int的指针。
因此需要进行两次操作(分别交换低4字节和高4字节),方可完成最终的交换。

如果对您有帮助,请点击采纳答案好吗,谢谢~~

*ap = (*ap) ^ (*bp);
*bp = (*ap) ^ (*bp);
*ap = (*ap) ^ (*bp);
这段代码实现ap和bp交换

^是xor运算,规则是
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
也就是相等为0,不等为1。
假设a=1,b=2(二进制是a=01 b=10)
a = a ^ b
此时a = 01 ^ 10 = 11
b = a ^ b
此时 b = 11 ^ 10 = 01
a = a ^ b
此时 a = 11 ^ 01 = 10
最后a = 2 b=1
也就是将a b颠倒了。

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复qq_33952658: 就是指针++,指向下一个元素
大约 2 年之前 回复
qq_33952658
qq_33952658 那个ap++和bp++的操作是什么情况呢 我也是觉得这三条就能实现交换了 但是后面那个ap++和bp++以及后三行的代码又是必要的
大约 2 年之前 回复

算数 与 你可以找两个数 换算成二进制 与 一下 这两个数就会交换

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问