试图在C中交换二维数组的元素

时间:2013-04-07 22:16:14

标签: c arrays

我正在编写一个交换二维数组元素的方法。我已经找到了答案,但这种交换似乎没有很多好的答案。与传统交换的主要区别在于,我不是试图在长度为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];

3 个答案:

答案 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} }