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

J..*_*..S 1 c arrays gcc pointers

我有一个 50 x 50 的矩阵arr[50][50],需要交换子数组arr[0]arr[1]. 即,每个子数组中的全部 50 个元素需要交换。

我能想到的唯一方法是使用如下循环:

for(i=0; i<50; ++i)
{
    int t = arr[0][i];
    arr[0][i] = arr[1][i];
    arr[1][i] = t;
}
Run Code Online (Sandbox Code Playgroud)

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

我试过这样的事情

int *t = arr[0];
arr[0] = arr[1];
arr[1] = t;
Run Code Online (Sandbox Code Playgroud)

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

然后我尝试指向一个数组

int (*t)[50] = arr[0];
arr[0] = arr[1];
arr[1] = t;
Run Code Online (Sandbox Code Playgroud)

这次我在第二行遇到了关于“从类型 'int *' 分配给类型 'int[50]' 时不兼容的类型”的错误。

AnT*_*AnT 5

如果您的矩阵是这样实现的,arr[50][50]那么物理交换两行的唯一方法是在内存中物理交换数据。你的周期是一种方法。其余的只是该方法的变体。您可以一个一个地交换矩阵元素(您的循环),您可以使用中间行大小的缓冲区(memcpy方法)交换整行。他们所有人仍然做同样的事情。没有办法解决。

如果您的数组以不同的方式实现 - 例如,一个“锯齿状”数组实现为指向子数组的指针数组,那么您将能够只交换两个指针并完成它。但在这种情况下arr[50][50]是不可能的。

如果您愿意,您可以通过单独的行指针数组将当前数组“转换”为“锯齿状”版本。该行指针数组现在将成为您的 matrix 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");
}
Run Code Online (Sandbox Code Playgroud)

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