2012-12-23 11 views
8

Mögliche Duplizieren weitergeben müssen:
Passing a pointer representing a 2D array to a function in C++Wie ein 2D-Array durch Zeiger in c

Ich versuche, meine 2-dimensionalen Array an eine Funktion durch Zeiger und ändern möchten passieren die Werte.

#include <stdio.h> 

void func(int **ptr); 

int main() { 
    int array[2][2] = { 
     {2, 5}, {3, 6} 
    }; 

    func(array); 

    printf("%d", array[0][0]); 
    getch(); 
} 

void func(int **ptr) { 
    int i, j; 
    for (i = 0; i < 2; i++) { 
     for (j = 0; j < 2; j++) { 
      ptr[i][j] = 8; 
     } 
    } 
} 

Aber das Programm stürzt damit ab. Was habe ich falsch gemacht?

+2

Verwenden richtigen Typen, 'Leere func (int (* ptr) [2]) ', oder übergeben Sie ein Array von Zeigern. –

+0

[Wie verwende ich Arrays in C++?] (Http://stackoverflow.com/q/4810664/1202636) – effeffe

+0

Arrays sind keine Zeiger. Zeiger sind keine Arrays. Was du falsch gemacht hast, hat es nicht für dich selbst wiederholt, bis du aufgehört hast, daran zu zweifeln. –

Antwort

3

Es stürzt ab, weil ein Array kein Zeiger auf den Zeiger ist, wird es versuchen, Array-Werte zu lesen, als ob sie Zeiger sind, aber ein Array enthält nur die Daten ohne Zeiger.
Ein Array ist alles im Speicher benachbarten, nur einen einzigen Zeiger akzeptieren und eine Besetzung tun beim Aufruf der Funktion:

func((int*)array); 

...

void func(int *ptr) { 
    int i, j; 
    for (i = 0; i < 2; i++) { 
     for (j = 0; j < 2; j++) { 
      ptr[i+j*2]=8; 
     } 
    } 
} 
+0

Danke. Du hast meinen Tag gerettet. Aber wie setze ich das i und j, wenn ich verschiedene Dinge in einem Array speichern möchte? –

+0

Ich habe nicht verstanden, was du meinst. –

9

Ihr Array ist vom Typ int[2][2] ("Array von 2 Array von 2 int") und sein Name wird zu einem Zeiger auf sein erstes Element, das vom Typ sein würde int(*)[2] ("Zeiger auf Array von 2 int"). So Ihre func Bedürfnisse ein Argument dieser Art zu nehmen:

void func(int (*ptr)[2]); 
// equivalently: 
// void func(int ptr[][2]); 

Alternativ können Sie einen Verweis auf den Array-Typen nehmen ("Referenz auf Anordnung von 2 Array von 2 int"):

void func(int (&ptr)[2][2]); 

Stellen Sie sicher, dass Sie sowohl die Deklaration als auch die Definition ändern.