2016-05-26 18 views
3

Ich versuche, über Doppelzeiger zu lernen. Ich versuche, ein 2d-Array zu drucken, indem Sie die Adresse des Arrays an eine Funktion übergeben. Aber Kompilierungsfehler kommt. Ich kann nicht verstehen, warum?Warum gibt dieser Code Kompilierungsfehler?

Unten ist der Code.

#include<stdio.h> 
#include<stdlib.h> 
void print(int **,int,int); 
int main() 
{ 

    int i,j; 
    int a[][3]={ 
       {1,0,1},{1,1,1}, {1,1,1} 
      }; 
      print(a,3,3); 
      return 0; 
} 
void print(int **A, int n11, int n12) 
{ 
    int i,j; 
    for(i=0;i<3;i++) 
      { 
       for(j=0;j<3;j++) 
       { 
        printf("%d ",*((A+i*n12)+j); 
       } 
       printf("\n"); 
      } 
} 

Fehlerprotokoll ---

set_matrix.c: In function 'main': 
set_matrix.c:29:19: warning: passing argument 1 of 'print' from incompatible poi 
nter type [-Wincompatible-pointer-types] 
      print(a,3,3); 
       ^
set_matrix.c:9:6: note: expected 'int **' but argument is of type 'int (*)[3]' 
void print(int **,int,int); 
^
+2

Werfen Sie einen Blick auch auf [diese SO post] (http://stackoverflow.com/questions/7586702/is-2d-array-a-double-pointer) – LPs

+2

Ihnen fehlt auch eine schließende Klammer für den printf –

+0

@LPs. Dies ist eine bessere Frage (http://stackoverflow.com/questions/1052818/create-a-pointer-to-two-dimensional-array). – sjsam

Antwort

1

ich über Doppelzeiger

Ich bin zu lernen, ich versuche nicht sicher, ob die Terminologie korrekt ist, aber ich würde nicht einen Zeiger verweisen Zeiger als double pointer, weil Sie leicht mit einem double* &verwechselt werden können.

Betrachten int x=1.0. Sie können haben:

int *ptr=&x; // You make ptr point to x(ie x's memory address). 

Aber denken Sie daran, dass Zeiger ist auch eine Art - ein Objekt genau zu sein. Ein Objekt belegt Speicher. Für die Speicherung der Adresse von ptr (dh & ptr), benötigen Sie einen Zeiger auf einen Zeiger so:

int **ptr_to_ptr=&ptr; // says ptr_to_ptr is a pointer to an (int*) 

Das größere Problem hier ist, wie können wir einen Zeiger auf int a[][] erklären.

Bei einem Array say, int a [3], sollte der Zeiger, der es darstellen soll, das folgende Format haben: int (*p)[3]. Wir sagen, p ist ein Zeiger auf ein Array von 3 ganzen Zahlen.

Hier ist der Unterschied, dass Sie ein Array von Arrays haben, dh int a[][3]. Der Zeiger auf dieses Array sollte dieses Format haben - int (*p)[][3]. Wir sagen, dass p ein Zeiger auf ein Array ist, jedes Element dieses Arrays selbst ist ein Array aus 3 ganzen Zahlen.

jetzt int ein Vergleich [3] und int a [3] [3]

 int a[3]     |   int a[3][3] 
________________________________________________________________________ 
     &a[0] ~ a (1)     | &a[0][0] ~ &a[0] ~ a 
            |    |------> follows (1) 
            |    
    a[0] is an int     |  a[0] is an int[3] 
            | 
            | 
you pass '&a' to int(*)[]   |  you pass '&a' to int(*)[][] 
(You omit the &, you get-but the | (You omit the &, you get-but the 
argument is of type int * error) |argument is of type int (*)[3] error) 
            | 
________________________________________________________________________ 

So richtig Ihr Programm zu implementieren ist:

#include<stdio.h> 
#include<stdlib.h> 
void print(int (*)[][3],int); //You need to pass only the rows 
int main() 
{ 
    int i,j; 
    int a[][3]={ 
    {1,0,1},{1,1,1},{1,1,1} 
    }; 
    print(&a,3); // You can programmtically determine the number of rows 
    return 0; 
} 
void print(int (*A)[][3], int x) // You cannot have int (*A)[][] 
{ 
    int i,j; 
    for(i=0;i<3;i++) 
    { 
    for(j=0;j<3;j++) 
    { 
     printf("%d\t",(*A)[i][j]); 
    } 
    printf("\n"); 
    } 
} 
+0

sjsam, Danke für deine Hilfe. Aber wenn ich ein Array (1d) von Ganzzahlen als 'int (* p) [3]' deklariere und versuche zu drucken, wird es nicht ausgeführt. Ich bitte Sie, dies zu erklären. – a874

+0

@ a874: erklären? Wenn Sie nur int (* ptr) [3]; Wie in einer Anweisung, dann kann ptr nicht verwendet werden, es sei denn, es wird gemacht, um auf ein Array say int a [3] zu zeigen, oder Sie weisen ihm explizit Speicher zu, indem Sie malloc verwenden – sjsam

1

Wenn ich Ihren Code testen, erhalte ich diese Fehler und Warnungen.

/home/dac/ClionProjects/gnu/main.c: In function ‘main’: 
/home/dac/ClionProjects/gnu/main.c:11:9: warning: passing argument 1 of ‘print’ from incompatible pointer type [-Wincompatible-pointer-types] 
    print(a,3,3); 
     ^
/home/dac/ClionProjects/gnu/main.c:3:6: note: expected ‘int **’ but argument is of type ‘int (*)[3]’ 
void print(int **,int,int); 
    ^
/home/dac/ClionProjects/gnu/main.c: In function ‘print’: 
/home/dac/ClionProjects/gnu/main.c:21:35: error: expected ‘)’ before ‘;’ token 
     printf("%d ",*((A+i*n12)+j); 
           ^
/home/dac/ClionProjects/gnu/main.c:21:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=] 
     printf("%d ",*((A+i*n12)+j); 
      ^
/home/dac/ClionProjects/gnu/main.c:22:5: error: expected ‘;’ before ‘}’ token 
    } 
^ 

Wenn Sie nur eine Matrix drucken möchten, können Sie die Matrix verwenden Sie erstellt und neu deklarieren, wie Sie es drucken, ähnlich dem folgenden Code ein.

#include <stdio.h> 
#define size 3 
void print_matrix(int x, int y, int a[size][size]) { 

    int i, j; 
    for(i = 0; i < x; i++) { 
    for(j = 0; j < y; j++) 
     printf("%d\t", a[i][j]); 
    putchar('\n'); 
    } 
} 

int main() { 
    int a[size][size]={ 
      {1,0,1},{1,1,1}, {1,1,1} 
    }; 
    print_matrix(size,size, a); 
    return 0; 
} 

Ausgabe

/system/cmake/generated/gnu-fadf49ce/fadf49ce/Debug/gnu 
1 0 1 
1 1 1 
1 1 1 

Process finished with exit code 0 

Wenn Sie über zwei Zeiger lernen, versuchen Sie es mit und die argv Ihres Programms Manipulation - es ist bereits ein Doppelzeiger. Oder erstellen Sie neue Matrizen dynamisch: int **matrix = malloc(size * sizeof(int *));

Oder wenn Sie die Zeigerversion Ihres ursprünglichen Problems (Drucken einer Matrix mit Zeigern) verwenden möchten.

#include <stdio.h> 
#define size 3 

void print_matrix(int (*a)[size], int n) { 
    int i, j; 
    for(i = 0; i < n; i++) { 
    for(j = 0; j < n; j++) 
     printf("%d\t", a[i][j]); 
    putchar('\n'); 
    } 

} 
int main() { 
    int a[][size]={ 
      {1,0,1},{1,1,1}, {1,1,1} 
    }; 
    print_matrix(a, size); 
    return 0; 
} 

Der obige Code verwendet Zeiger und druckt die gleiche Matrix:

1 0 1 
1 1 1 
1 1 1 

Zeiger zu lernen, können Sie eine Matrix von Zeigern erklären und versuchen, es zu manipulieren, wird die folgende erstellt und druckt eine Matrix aus Zufallszahlen mit Zeigern.

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#define size 3 

void print_matrix(int ***matrix) { 
    for (unsigned row = 0; row < size; row++) { 
    for (unsigned column = 0; column < size; column++) { 
     printf("%d ", matrix[row][column]); 
    } 
    printf("\n"); 
    } 
} 

int main() { 
    int ***matrix = malloc(size * sizeof(int **)); 
    if (!matrix) abort(); 
    srand(time(NULL)); 
    for (unsigned row = 0; row < size; row++) { 
    matrix[row] = calloc(size, sizeof(int *)); 
    if (!matrix[row]) abort(); 
    for (unsigned column = 0; column < size; column++) { 
     matrix[row][column] = rand(); 
    } 
    } 
    print_matrix(matrix); 
    return 0; 
} 

Ausgabe

2058554958 959327445 396140031 
214331704 706399125 124749117 
1280566165 206604059 668072276 
+0

, Thaks, aber ich brauche noch etwas Hilfe.Ur Deklaration von 'int (* a) [Größe]' bedeutet, dass 'a ist ein Array von" Größe "Anzahl von ganzen Zahlen.Am richtig? Korrigieren Sie mich, wenn ich bin falsch. – a874