K
Buchleser1.1 schrieb:
...
Konvertierung des Parameters 1 von 'const char [2][2]' in 'const char **' nicht möglich
...
Irgendwie verstehe ich nicht, wie ich 2-dimensionale Arrays an Funktionen übergeben kann. Das mit dem Doppelpointer scheint ja irgendwie nicht zu funktionieren... Falls ich einfach nur 2 leere Klammern angebe, will er von mir logischerweise immer die Grösse der zweiten Dimension als Konstante haben.
Dann hast du nicht verstanden, wie C-Arrays funktionieren. Wie kommst du darauf, dass das mit dem Doppelzeiger funktionieren sollte?
char a[2][3] = {{'1','2','3'},{'A','B','C'}};
hat folgendes Speicherlayout:
Adresse: 314 315 316 317 318 319
+---------+---------+---------+---------+---------+---------+
Inhalt: | '1' | '2' | '3' | 'A' | 'B' | 'C' |
+---------+---------+---------+---------+---------+---------+
| a[0][0] | a[0][1] | a[0][2] | a[1][0] | a[1][1] | a[1][2] |
Namen: |----------- a[0] ------------|----------- a[1] ------------|
|---------------------------- a ----------------------------|
Beachte: Hier taucht nirgens ein Zeiger im Speicher auf. Deswegen kann du hier auch nicht auf einen Zeiger zeigen. Du kannst natürlich noch ein Zeiger-Array bauen:
char *z[2] = {a[0],a[1]};
Das sieht dann so aus:
Adresse: 320 321
+---------+---------+
Inhalt: | 314 | 317 |
+---------+---------+
Namen: |-- z[0] -|-- z[0] -|
|-------- z --------|
und das könntest du einer Funktion übergeben:
void foo(char** zz)
{
assert(z[0][0] == '1');
assert(z[1][2] == 'C');
}
...
foo(z);
...
wobei der Funktionsparameter zz dann den die Adresse 320 speichern würde.
Der springende Punkt ist: Ein Array ist kein Zeiger. Du kannst aber einen Array-Ausdruck vom Typ T[N] an einer Stelle verwenden, wo du einen Ausdruck vom Typ T* brauchst. Da wird dann automatisch die Adresse des ersten Array-Elements eingesetzt. Das klappt aber logischerweise nur auf der ersten Ebene. Beachte, dass a[b] äquivalent zu *(a+b) ist, falls a nicht von einem benutzerdefinierten Typ ist.