2017-06-18 53 views
0

我有一个50 x 50矩阵arr[50][50],需要交换子阵列arr[0]arr[1]中的值。即,每个子阵列中的整个50个元素需要被交换。在C中交换多维数组的子阵列

我能想到的唯一办法做到这一点是使用像一个循环:

for(i=0; i<50; ++i) 
{ 
    int t = arr[0][i]; 
    arr[0][i] = arr[1][i]; 
    arr[1][i] = t; 
} 

我想知道是否有任何简单或较短的方法呢?使用指针可能?

我试过的东西

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

,但大约在第一行的“不兼容的类型分配到类型‘INT [2]’从类型‘诠释*’时”给了错误。

然后我“分配给从类型‘诠释*’输入‘INT [50]’时不兼容的类型”试图指针数组

int (*t)[50] = arr[0]; 
arr[0] = arr[1]; 
arr[1] = t; 

这次我在约第二行有误差。

+0

嗯更快的方法将是使用而不是使用第三可变XOR表达 - 'ARR [0] [I] = ARR [0] [I]^ARR [1] [I]; arr [1] [i] = arr [0] [i]^arr [1] [i]; ARR [0] [I] = ARR [0] [I]^ARR [1] [I];',复杂性将是相同的,但恒定的因素而改变。 –

+3

可以用复制数据的唯一途径的'='是从一个简单的变量,单个阵列元件,或一个'struct'。考虑使用'int temp [50]'和'memcpy'。 –

+0

您将需要复制行(或交换它们)。你可以使用'int tmp [50];'然后'memcpy(tmp,arr [0],50 * sizeof * tmp); memcpy(arr [0],arr [1],50 * sizeof * arr [0]);的memcpy(ARR [1],TMP,50 * *的sizeof ARR [1]);' –

回答

4

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

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

如果您愿意,您可以通过单独的行指针数组将“当前数组”转换为“锯齿状”版本。该行指针数组现在将成为你的矩阵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]语法与它合作。

+0

那锯齿状“阵列诀窍是新的我。 –

0

您必须将数据复制到与memcpy被换,我已经提供了样本程序,以显示你如何能做到这一点(即交换改编[0]和改编[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; 
} 
+0

@weather Vane,真我早先原本采取4 * 4矩阵,现在纠正它 – Pras

+0

感谢您的示例 –

1

作为评价所解释的,与其他的答案内,以便交换的实际2D阵列的行(如并列于指针数组),则必须复制/从源到移动数据内存中的目标行。解决这个问题最直接的方法是使用循环将元素逐个复制到临时存储以实现交换,或者使用C库提供的存储器复制功能(例如memcpymemmove)。一个简单的实现使用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'); 
    } 

} 

示例使用/输出

$ ./bin/array2d_swap_row 
0 0 0 0 0 0 0 0 0 0 
1 1 1 1 1 1 1 1 1 1 
2 2 2 2 2 2 2 2 2 2 

1 1 1 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 
2 2 2 2 2 2 2 2 2 2 

看东西了,让我知道,如果你有任何问题。

+0

感谢您的示例! –