在C中交换多维数组的子数组

时间:2017-06-18 05:02:16

标签: c arrays pointers gcc

我有一个50 x 50矩阵constructor(private azureService: AzureService) { } ,需要交换子数组arr[50][50]arr[0]中的值。 即,需要交换每个子阵列中的50个元素。

我能想到的唯一方法是使用类似的循环:

arr[1]

我想知道是否有更简单或更短的方法?使用指针可能吗?

我尝试过像

这样的事情
for(i=0; i<50; ++i)
{
    int t = arr[0][i];
    arr[0][i] = arr[1][i];
    arr[1][i] = t;
}

但是在第一行中出现了关于“从类型'int *'”分配类型'int [2]'时出现“不兼容类型”的错误。

然后我尝试了指向数组的指针

int *t = arr[0];
arr[0] = arr[1];
arr[1] = t;

这次我在第二行有关“从类型'int *'”分配类型'int [50]'时出现“不兼容类型”的错误。

3 个答案:

答案 0 :(得分:4)

如果您的矩阵实现为arr[50][50],则物理交换两行的唯一方法是在内存中物理交换数据。你的周期是一种方法。剩下的就是这种方法的变化。您可以逐个交换矩阵元素(您的周期),您可以使用中间行大小的缓冲区(memcpy方法)交换整个行。他们所有人仍然做同样的事情。没有办法解决它。

如果您的阵列采用不同的方式 - 例如,a&#34;锯齿状的&#34;数组作为指针的数组实现到子数组,那么你就可以只交换两个指针并完成它。但是在arr[50][50]的情况下,这是不可能的。

如果您愿意,您可以&#34;转换&#34;你当前的数组变成了#34;锯齿状的&#34;版本由单独的行指针数组组成。该行指针数组现在将成为您的矩阵a,而原始a[50][50]将成为a_data

int a_data[50][50];

int *a[50];
for (unsigned i = 0; i < 50; ++i)
  a[i] = a_data[i];

/* Fill the matrix */
for (unsigned i = 0; i < 50; ++i)
  for (unsigned j = 0; j < 50; ++j)
    a[i][j] = rand();

/* Print the matrix */
for (unsigned i = 0; i < 50; ++i)
{
  for (unsigned j = 0; j < 50; ++j)
    printf("%d ", a[i][j]);
  printf("\n");
}

/* Swap the rows */
int *temp = a[0];
a[0] = a[1];
a[1] = temp;

/* Print the matrix */
for (unsigned i = 0; i < 50; ++i)
{
  for (unsigned j = 0; j < 50; ++j)
    printf("%d ", a[i][j]);
  printf("\n");
}

请注意,尽管a的物理结构现在不同,但您仍然可以使用a[i][j]语法来处理它。

答案 1 :(得分:1)

如评论中所述,在其他答案中,为了交换实际2D数组的行(与指针数组相对应),您必须将数据从源复制/移动到内存中的目标行。解决此问题的最直接方法是使用循环将元素逐个元素复制到临时存储以实现交换,或者使用C库提供的内存复制函数(例如memcpy或{{ 1}})。使用memmove的简单实现(对于示例而言,使用memcopy数组显示数组)将是:

3x10

示例使用/输出

#include <stdio.h>
#include <string.h>

enum { ROW = 3, COL = 10 };

void swaprow (int (*a)[COL], int c1, int c2);
void prna (int (*a)[COL]);

int main (void) {

    int a[ROW][COL] = {{0}};

    for (int i = 0; i < ROW; i++)
        for (int j = 0; j < COL; j++)
            a[i][j] = i;

    prna (a);
    swaprow (a, 0, 1);
    putchar ('\n');
    prna (a);

    return 0;
}

void swaprow (int (*a)[COL], int c1, int c2)
{
    int tmp[COL];

    memcpy (tmp, a[c1], COL * sizeof *tmp);
    memcpy (a[c1], a[c2], COL * sizeof *a[c1]);
    memcpy (a[c2], tmp, COL * sizeof *a[c2]);
}

void prna (int (*a)[COL])
{
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++)
            printf ("%2d", a[i][j]);
        putchar ('\n');
    }

}

仔细看看,如果您有任何问题,请告诉我。

答案 2 :(得分:0)

您必须复制要与memcpy交换的数据,我已提供示例程序以显示如何执行此操作(即交换arr [0]和arr [1])。

int main(void) {
    // your code goes here
    int t[3];
    int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    printf("\n%d %d %d",arr[0][0],arr[0][1],arr[0][2]);
    printf("\n%d %d %d",arr[1][0],arr[1][1],arr[1][2]);
    memcpy(t,arr[0],sizeof(t));
    memcpy(arr[0],arr[1],sizeof(t));
    memcpy(arr[1],t,sizeof(t));
    printf("\n%d %d %d",arr[0][0],arr[0][1],arr[0][2]);
    printf("\n%d %d %d",arr[1][0],arr[1][1],arr[1][2]);
    return 0;
}