2013-05-23 14 views
26

Ich lerne C und habe Probleme beim Übergeben des Zeigers eines 2D-Arrays an eine andere Funktion, die dann das 2D-Array druckt. Jede Hilfe wäre willkommen.Wie ein 2D-Array durch Zeiger in C übergeben?

int main(void){ 
    char array[50][50]; 
    int SIZE; 

    ...call function to fill array... this part works. 

    printarray(array, SIZE); 
} 

void printarray(char **array, int SIZE){ 
    int i; 
    int j; 

    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", array[j][i]); 
     } 
     printf("\n"); 
    } 
} 
+1

Leere print (char array [] [50], int SIZE) – Lucas

+1

Während es möglich ist, dies zu tun, sind Sie besser dran, es zu einem 1D-Array konvertiert und unter Verwendung von 'j * SIZE + i' um es zu indizieren. – Dave

+0

@Dave warum? ............................... (Just Filler) – kotlomoy

Antwort

22

char ** stellt keine 2D-Array - es wäre ein Array von Zeigern auf Zeiger. Sie müssen die Definition von printarray ändern, wenn Sie es ein 2D-Array übergeben möchten:

void printarray(char (*array)[50], int SIZE) 

oder äquivalent:

void printarray(char array[][50], int SIZE) 
+0

könnten Sie erklären, was die Syntax "char * array [50]" in einfachem Englisch bedeutet? – user1362058

+3

@ user1362058: Array von 50 Zeiger auf char. www.cdecl.org –

+2

Das Ausführen von 'cdecl explain 'char (* arr) [50]' ergibt 'deklarieren arr als Zeiger auf das Array 50 von char'. –

4

In main() wird die Variable "Array" als

erklärt
char array[50][50]; 

Dies ist ein 2500 Byte Datenstück. Wenn main() "array" übergeben wird, ist es ein Zeiger auf den Anfang dieser Daten. Es ist ein Zeiger auf ein char erwartet in Reihen von 50

Noch() in Funktion print organisiert werden, erklären Sie

char **array 

„Array“ hier ist ein Zeiger auf einen „char * Zeiger“ .

@Lucus Vorschlag von "Leere print (char array [] [50], int SIZE)" funktioniert, mit der Ausnahme, dass es nicht generisch ist, dass Ihre SIZE Parameter muss 50.

Idee: Niederlage (yeech) die Art des Parameter-Array in print()

void printarray(void *array, int SIZE){ 
    int i; 
    int j; 
    char *charArray = (char *) array; 

    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", charArray[j*SIZE + i]); 
     } 
     printf("\n"); 
    } 
} 

Eine elegantere Lösung ist das "array" in main() ein Array von Zeigern zu machen.

// Your original printarray() 
void printarray(char **array, int SIZE){ 
    int i; 
    int j; 
    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", array[j][i]); 
     } 
     printf("\n"); 
    } 
} 

// main() 
char **array; 
int SIZE; 
// Initialization of SIZE is not shown, but let's assume SIZE = 50; 
// Allocate table 
array = (char **) malloc(SIZE * sizeof(char*)); 
    // Note: alternative syntax 
    // array = (char **) malloc(SIZE * sizeof(*array)); 
// Allocate rows 
for (int row = 0; row<SIZE; row++) { 
    // Note: sizeof(char) is 1. (@Carl Norum) 
    // Shown here to help show difference between this malloc() and the above one. 
    array[row] = (char *) malloc(SIZE * sizeof(char)); 
    // Note: alternative syntax 
    // array[row] = (char *) malloc(SIZE * sizeof(**array)); 
    } 
// Initialize each element. 
for (int row = 0; row<SIZE; row++) { 
    for (int col = 0; col<SIZE; col++) { 
    array[row][col] = 'a'; // or whatever value you want 
    } 
} 
// Print it 
printarray(array, SIZE); 
... 
+0

'sizeof (char)' ist '1'. –

+3

@CarlNorum Nur weil es nicht heißt, müssen Sie es rücksichtslos durch 1 ersetzen (oder es ganz entfernen). 'sizeof'-Anweisungen können viel dazu beitragen, dass Ihr Code selbstdokumentiert wird. – Thomas

+0

@Thomas - merci. – chux

0

Da C99 dynamische große Arrays unterstützt, wird die folgende Art ist einfach bequemer, ein 2-dim Array passieren:

void printarray(void *array0, int SIZE){ 
    char (*array)[SIZE] = array0; 
    int i; 
    int j; 
    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", array[j][i]); 
     } 
     printf("\n"); 
    } 
} 
0

Sie können leicht die 2D-Arrays unter Verwendung von Doppelzeiger übergeben.

void printarray(char **array, int n) 
    { 
    int i, j; 
    for(i=0; i<n; i++) 
    { 
     for(j=0; j<n; j++) 
     { 
      printf("%c ", array[i][j]); 
     } 
     printf("\n"); 
    } 
    } 

    int main() 
    { 
     int n = 2; 
     int i, j; 

     char **array = (char **) malloc(n * sizeof(char*)); 

     for (i=0; i<n; i++) 
     { 
     array[i] = (char *) malloc(n* sizeof(char)); 
     } 

    for (i=0; i<n; i++) 
    { 
     for (j=0; j<n; j++) 
     { 
      scanf("%c ", &array[i][j]); 
     } 
    } 

    printarray(array, n); 

    return 0; 
    } 

Voll Code: Ideone