2017-06-18 49 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

感謝您的示例! –