[C++]Zeiger auf ein zweidimensionales Zeichenarray

Sepsis

Cadet 2nd Year
Registriert
Apr. 2007
Beiträge
25
Hi Leute,

Also:

Ich will mit einer Funktion ein Array (in der Form: char name[21][41]) in der main Funktion manipulieren. Da ich mehrere solcher arrays(gleiche größe und typ) verwenden will habe ich mir gedacht die entsprechende Adresse an die Funktion zu übergeben und so das dazugehörige Array von der Funktion aus ändern zu können.

Nun:

Wie deklariere ich einen Zeiger auf ein 2-dimensionales Zeichenarray und wie übergebe ich ihn als Parameter?
 
Ein Array in C(++) ist ein Zeiger. Da du meinst, dass alle deine Arrays gleich groß sind, kannst du das direkt in der Funktion definieren:

Code:
void tuWas(char bla[21][41])

Dieser Funktion könntest du ohne Probleme dein Array übergeben. Sollten deine Arrays mal nicht gleich groß sein, dann könnte man das so machen, dass du dein Array so erstellst:

Code:
char* bla[21];
for(unsigned i = 0; i < 5; ++i)
    bla[i] = new char[41];

Ein so erstelltes zweidimensionales Array könntest du auch einer Funktion übergeben, die einen "char**" als Parameter erwartet.
 
Zuletzt bearbeitet:
Danke,

Aber wie bringe ich die geänderten Werte in die main Funktion zurück?
Kann eine Funktion ein Array als Rückgabewert haben?
 
Das ist doch der Witz eines Pointers. Du musst nichts "zurückbringen", sondern änderst den Wert der Variable direkt.

Wenn du das Array wie von DerEineDa beschrieben an eine Funktion übergibst, dann sind nach dem Ausführen dieser Funktion die Werte des originalen Arrays geändert.
 
Ja das mit den Zeigern is mir klar deswegen hab ich ja gefragt.

Also wenn ich das z.B. hab:

Code:
void tuWas(char ptr[21][41])
{
    ptr[0][0]='x';
}


int main()
{
   char xyz[21][41];
   char abc[21][41];
   
   tuWas(xyz[][]);
}

Dann ändert sich also xyz "von ganz allein"?
Hab ich das richtig verstanden?
 
Du könntest es natürlich einfach ausprobieren, aber ja: tut es.

Aufrufen tust du die Funktion aber nicht mit
Code:
tuWas(xyz[][]);
sondern mit
Code:
tuWas(xyz);
 
DerEineDa schrieb:
Ein Array in C(++) ist ein Zeiger.
Nein, das ist falsch. Ein Pointer ist "Storage" für einen Zeiger auf eine Speicheradresse. Ein Array dagegen ist "Storage" für die Daten selbst. Ein Array konvertiert allerdings in fast allen Fällen implizit in einen Zeiger auf sein erstes Element. Daher kommt oft die Annahme (und man liest sie sogar in manchen schlechten Büchern), dass Array und Zeiger das selbe wären. Das ist ein kleiner, aber wichtiger Unterschied.

Nachtrag:
Wenn man z.B. in einer Objekt-Datei ein Array definiert, meinetwegen int foo[100], und es woanders über extern int* foo bekannt macht, ist das tödlich, da der Compiler das Array dann als Pointer interpretiert.
 
Zuletzt bearbeitet:
Ich hab von meinem Prof gelernt, dass ein Array ein Zeiger auf sein erstes Element ist. Wenn das falsch ist, dann hab ich eben nen schlechten Prof :)
 
Naja, ein Array ist kein Zeiger auf sein erstes Element, aber beim Zugriff wird es in fast allen Fällen implizit in einen Zeiger auf sein erstes Element umgewandelt. Das nennt sich Array-To-Pointer-Conversion. Z.B. beim Zugriff mit a[5] wird das Array in einen Zeiger umgewandelt und dann mittels Zeigerarithmetik auf das fünfte Element zugegriffen.
Hier kannst du das nachlesen:
http://www.kuzbass.ru:8086/docs/isocpp/conv.html#conv.array
4.0.1-4.0.5 solltest dir dazu auch mal anschauen:
http://www.kuzbass.ru:8086/docs/isocpp/conv.html

Eine Ausnahme, wo diese Umwandlung nicht stattfindet ist der sizeof-Operator. Ansonsten würde sizeof für einen Pointer und ein Array das selbe Ergebnis liefern. Das funktioniert nur dort, wo die ursprüngliche Deklaration des Arrays bekannt ist. In einer Funktion, an die man z.B. f(int a[]) übergibt, funktioniert das nicht mehr.
 
Zuletzt bearbeitet:
Zurück
Oben