交换两个大小相等的值
题目要求:
将数组A中的内容和数组B中的内容进行交换。(数组一样大)
解题思路:
分析题目中说到的数组一样大,那么也就是说数组中元素的个数和类型相等,那么要达到交换这两个数组,仅需将其每一位对应的元素进行交换即可,这样也就达到了交换数组的效果。
- 第一步:
先构造一个能将两个数交换的函数,达到能将数组对应的元素交换的效果,那么如何才能将这两个数进行交换呢,相信学到这里,你也应该会很多种交换数的方法,在这里想提醒一下,如果想要改变实参,那么形参应当给的是参数的指针,而不是给参数的值。
第一种方法:
//可以使用c语言当中的位异或操作,达到不创建中间变量,即可交换的目的
void swap(int* a, int* b)
{
*a = *a^*b;
*b = *a^*b;
*a = *a^*b;
}
第二种方法:
void swap(int* a, int* b)
{
int tmp;
tmp = *a;
*b = *a;
*a = tmp;
}
这两种方法都可以达到交换的目的。
- 第二步:
走到这里,我们就已经能将两个数进行交换,那么如何将两个数组中的对应元素进行交换呢?我们可以通过遍历数组,将其对应位置进行交换。为了提高代码的可利用率,建议还是将能实现功能的代码进行封装为函数,更好维护,也更方便后续的阅读。
在这里我们也应当注意,我们需要交换的是两个数组的值,也就是说,实际的数组必须改变,那么对于函数而言,也应当传他的地址,才能达到修改实参的目的。
一个数组作为参数时,默认传的都是他的第一个元素的地址,不用加上 &
,默认就是他的地址,但对于他的元素来讲,应当加上&
void swap_arr(int* arr_a,int* arr_b)
{
for (int i = 0; i < ARRNUM; i++)
{
swap(&arr_a[i], &arr_b[i]);
}
}
此时我们将要交换的数组传给这个函数即可达到交换数组内容的效果。
完整代码
#include <stdio.h>
#define ARRNUM 3
void swap(int* a, int* b)
{
*a = *a^*b;
*b = *a^*b;
*a = *a^*b;
}
void swap_arr(int* arr_a,int* arr_b)
{
for (int i = 0; i < ARRNUM; i++)
{
swap(&arr_a[i], &arr_b[i]);
}
}
int main()
{
int a[3] = { 0, 1, 2 };
int b[3] = { 3, 4, 5 };
printf("原来a数组的值为:%d %d %d \n", a[0], a[1], a[2]);
printf("原来b数组的值为:%d %d %d \n", b[0], b[1], b[2]);
swap_arr(a, b);
printf("交换后a数组的值为:%d %d %d \n", a[0], a[1], a[2]);
printf("交换后b数组的值为:%d %d %d \n", b[0], b[1], b[2]);
return;
}
效果图
总结
对于函数想要实现通过改变形参而改变实参的效果,我们必须进行操作他的指针,如果只是进行传值操作,并不会改变实际的值。这也是c语言比较特殊的一个地方。