在前面的博客中,我实现了一个交换两个值的函数,并简单介绍了值传递与地址传递的异同,还不清楚上面内容的可以点击查看【写一个交换函数】
在本篇分享的交换两个数组内容的函数,主要思想如下:
实现原理:与交换两个值的实现相同,就是通过地址传递,从而实现在交换函数中值的改变直接联动main函数中参数。
- 根据地址传递的特点:传递数组名,接收为数组的首地址(上篇博客有更多讲解)。
- 将数组中的元素逐个进行值交换(两个数组中元素个数相同)。
交换思想:与交换两个值的思想也相同,就是借用一个临时变量,为了不互相覆盖。
或者在这篇【交换函数三种思想】博客中,我介绍了其他的交换思想也可供参考使用。
一维数组中所有值的交换:完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Change(int *a, int *b)
{
int t; //t为临时变量
t = *a;
*a = *b;
*b = t;
}
int main()
{
int A[5];
int B[5];
int i, j, k;
printf("请输入A数组的五个数:");
for (i = 0; i < 5; i++)
{
scanf("%d", &A[i]);
}
printf("\n请输入B数组的五个数:");
for (j = 0; j < 5; j++)
{
scanf("%d", &B[j]);
}
Change(A,B); //直接数组交换
// for (k = 0; k < 5; k++) //逐个值交换
// { Change(&A[k], &B[k]); }
printf("\n输出交换后的A数组:");
for (i = 0; i < 5; i++)
{
printf("%d ",A[i]);
}
printf("\n输出交换后的B数组:");
for (j = 0; j < 5; j++)
{
printf("%d ",B[j]);
}
printf("\n");
return 0;
}
数组交换结果:
逐个值交换结果:
上面的两种方式,都可以实现交换数组中的值。但还是有区别的,当A,B数组中元素相同时,我们用以上两种方法都能实现数组交换;而若两个数组中元素个数不相同时,我们只能用第一种,即直接交换数组指针指向的地址,因为这时用值挨个交换的话,会因为A,B中数组元素个数不同导致结果错误(程序可能会为元素较少的数组补充默认值)。
2021/12/10补充:用C语言实现二维数组中只交换某行的函数(列与列对应)
二维数组中某行值的交换:完整代码
#include <stdio.h>
void Change(int *a, int *b)
{
int t; //t为临时变量
t = *a;
*a = *b;
*b = t;
}
int main()
{
int i, j, k;
int A[2][4];
int B[4][4];
printf("请输入A数组,按行输入2行4列:");
for(i = 0 ; i < 2 ; i++)
{
for(j = 0 ; j < 4 ; j++)
scanf("%d", &A[i][j]);
}
printf("\n请输入B数组,按行输入4行4列:");
for(i = 0 ; i < 4 ; i++)
{
for(j = 0 ; j < 4 ; j++)
scanf("%d", &B[i][j]);
}
for(k = 0; k < 4 ; k++) //k<4因为A,B数组都是4列
{ Change(&A[1][k],&B[1][k]); } //A[1][],B[1][]表示交换第二行的值(不能交换3,4行,因为A数组没有3,4行)
printf("\n输出交换后的A数组:\n");
for (i = 0; i < 2; i++)
{
for(j = 0 ; j < 4 ; j++)
{
printf("%d ",A[i][j]);
}
printf("\n");
}
printf("输出交换后的B数组:\n");
for (i = 0; i < 4; i++)
{
for(j = 0 ; j < 4 ; j++)
{
printf("%d ",B[i][j]);
}
printf("\n");
}
return 0;
}