我正在编写一个交换二维数组元素的方法。我已经找到了答案,但这种交换似乎没有很多好的答案。与传统交换的主要区别在于,我不是试图在长度为2的数组中交换整数,而是尝试交换一对长度为2的数组,更具体地说是指针。我是C的新手(尝试从Java切换)。当我编译下面的代码时,我收到一个警告“赋值从指针生成整数而没有强制转换”。任何帮助将不胜感激。提前谢谢。
void swap(int array[][2], int indexA, int indexB)
{
int *temp = array[indexA];
*array[indexA] = array[indexB];
*array[indexB] = temp;
}
编辑:我也尝试了下面的代码来替换最后两行(不包括括号,但是这导致编译器在从类型'int *分配到类型'int [2]'时给出错误“不兼容的类型” ''对于每一行。
array[indexA] = array[indexB];
array[indexB] = temp;
编辑:数组声明在下面,并且交换函数作为快速排序实现的一部分被调用。调用swap方法的sort方法使用与我在swap中使用的相同类型的参数声明(即“int array [] [2])。
int counts[256][2];
答案 0 :(得分:3)
您的代码正在尝试对两个元素数组进行值赋值,这是不允许的(对于两个元素数组或任何其他长度的数据),除非它们被隐藏在结构中。
要移动数据,您有几种选择。保留现有原型,您可以执行以下操作:
void swap(int array[][2], int indexA, int indexB)
{
int temp[2];
memcpy(temp, array[indexA], sizeof(temp));
memcpy(array[indexA], array[indexB], sizeof(array[indexA]));
memcpy(array[indexB], temp, array[indexB]);
}
或者,您可以使用元素循环:
void swap(int array[][2], int indexA, int indexB)
{
for (size_t i=0;sizeof(array[0])/sizeof(array[0][0]);++i)
{
int temp = array[indexA][i];
array[indexA][i] = array[indexB][i];
array[indexB][i] = temp;
}
}
最后,你也可以考虑使用这样的东西:
void swap(int (*a)[2], int (*b)[2])
{
int temp[sizeof(*a)/sizeof((*a)[0])];
memcpy(temp,a,sizeof(temp));
memcpy(a,b,sizeof(*a));
memcpy(b,temp,sizeof(*b));
}
并在你的来电方面调用它:
swap(counts[indexA], counts[indexB]);
这是更可读的恕我直言。样本如下:
#include <stdio.h>
#include <stdlib.h>
void swap(int (*a)[2], int (*b)[2])
{
int temp[sizeof(*a)/sizeof((*a)[0])];
memcpy(temp,a,sizeof(temp));
memcpy(a,b,sizeof(*a));
memcpy(b,temp,sizeof(*b));
}
int main(int argc, char *argv[])
{
int counts[10][2];
int indexA = 1, indexB = 2;
counts[indexA][0] = counts[indexA][1] = 1;
counts[indexB][0] = counts[indexB][1] = 2;
swap(counts[indexA], counts[indexB]);
// better be 2 2
printf("%d %d\n", counts[indexA][0], counts[indexA][1]);
return 0;
}
<强>输出强>
2 2
答案 1 :(得分:2)
这应该可以解决警告问题,如果我理解你的情况,它就会起作用。
int *temp = array[indexA];
array[indexA] = array[indexB];
array[indexB] = temp;
请记住,因为你有一个2维数组,“array [x]”的值仍然是指针。
编辑:
试试这种方式。
int temp[2];
memcpy(temp, array[indexA], sizeof(temp));
memcpy(array[indexA], array[indexB], sizeof(temp));
memcpy(array[indexB], temp, sizeof(temp));
答案 2 :(得分:0)
验证了我的案例,可以使用std::swap()
:
#include <algorithm> // C++98
#include <utility> //C++11
int array[3][2] = { {1, 2}, {3, 4}, {5, 6} };
std::swap(array[0], array[2]);
// Now it's { {5, 6}, {3, 4}, {1, 2} }