3

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

3 回答 3

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
于 2013-04-07T23:17:20.560 回答
2

这应该可以解决警告,如果我正确理解您的情况,它将起作用。

int *temp = array[indexA];
array[indexA] = array[indexB];
array[indexB] = temp;

请记住,当您有一个二维数组时,“array[x]”的值仍然是一个指针。

编辑:

试试这个方法。

int temp[2];
memcpy(temp, array[indexA], sizeof(temp));
memcpy(array[indexA], array[indexB], sizeof(temp));
memcpy(array[indexB], temp, sizeof(temp));
于 2013-04-07T22:32:47.683 回答
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} }
于 2016-09-02T19:24:20.443 回答