Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
Hello,大家好,我是泽奀,一起学习进步(●'◡'●)。
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩
前言
Hello,大家好,我是泽奀,今天带来题目第二十二题。这种题目是我们初学者必须做的,只有题目量刷的多了到时候你去学数据结构就不会显得怎么的吃力。所以题目是必须要多去练习的,只有多多练习,你才能体会到做题的快了。
题目描述
用指针实现两个值的交换,不能创建临时变量来进行交换替换。
题目分析
这里来说下,为什么要用指针变量进行交换。
通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。 如果你不通过指针的方式进行交换的话,一旦出了函数的形参当中就立马会销毁其中的值,就达不到交换的结果。
其次,不能创建临时变量来进行交换。其实这个很好办用按位异或就可以了,那么我们要知道按位异或是什么才行接下来来介绍下什么是按位异或(^∀^●)ノシ
那么我们要知道按位异或的运算规则才行。
0^0=0; 0^1=1; 1^0=1; 1^1=0;
题目代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void swap(int *x, int *y)
{
//按位异或 假设 是 x = 1,y = 2
*x ^= *y;//x = x^y // 0001 ^ 0010 = 0011 = 3 此时x = 3
*y ^= *x;//y = x^y // 0011 ^ 0010 = 0001 = 1 此时y = 1
*x ^= *y;//x = x^y // 0011 ^ 0001 = 0010 = 2 此时x = 2 结果 x = 2,y = 1
}
int main(void)
{
int a = 0, b = 0;
printf("请输入两个数字:");
scanf("%d %d", &a, &b);
printf("a,b交换前: a = %d,b = %d\n", a, b);
swap(&a, &b);
printf("a,b交换后: a = %d,b = %d\n", a, b);
return 0;
}
运行结果
请输入两个数字:10 20
a,b交换前:a = 10,b = 20
a,b交换后:a = 20,b = 10
最后
电路这玩意真的是太难了学了学不来了,我还是老老实实刷题吧。