Forum: Compiler & IDEs Adressübergabe zweidimensionales Array


von Mouse (Gast)


Lesenswert?

Hallo,

ich habe einen Typ für ein zweidimensionales Array definiert:

typedef int arraytype[10][10];

Von diesem Typ lege ich jetzt eine Variable an:

arraytype a;

Dazu noch einen Pointer:

arraytype *pa;

Wenn ich jetzt die Adresse von a an pa übergeben will, geht das so:

pa = &a;

Warum gilt hier nicht, dass der Name des Arrays ein Zeiger auf sein 
erstes Element ist?

pa = a; //Fehler

Danke schonmal.

von Grrrr (Gast)


Lesenswert?

Mouse schrieb:
> Warum gilt hier nicht, dass der Name des Arrays ein Zeiger auf sein
> erstes Element ist?

Das ist durchaus so. Aber die Elemente sind hier int während pa ein 
Zeiger auf arraytype ist.

von Mouse (Gast)


Lesenswert?

>Das ist durchaus so. Aber die Elemente sind hier int während pa ein
>Zeiger auf arraytype ist.

Ein typecast funktionierte auch nicht:

pa = (arraytype*) a;

Der Compiler warf Warnungen von wegen unterschiedliche Anzahl 
Dereferenzierungen, etc.

von Grrrr (Gast)


Lesenswert?

Mouse schrieb:
> Ein typecast funktionierte auch nicht:
>
> pa = (arraytype*) a;
>
> Der Compiler warf Warnungen von wegen unterschiedliche Anzahl
> Dereferenzierungen, etc.

Das halte ich für beabsichtigt und wünschenswert.

Lass Dir diese Aussage

> Das ist durchaus so. Aber die Elemente sind hier int während pa ein
> Zeiger auf arraytype ist.

bitte nochmal besonders lange auf der Zunge zergehen.

von Grrrr (Gast)


Lesenswert?

Kein Wunder das K.-H.B. casts für Pfui hält. Sind verführerischerer die 
Dinger als ich dachte

von Grrrr (Gast)


Lesenswert?

Moment mal, habe ich was falsch verstanden?

Was war die genaue Fehlermeldung bei Deinem ersten Versuch?

von Mouse (Gast)


Lesenswert?

>Moment mal, habe ich was falsch verstanden?
>
>Was war die genaue Fehlermeldung bei Deinem ersten Versuch?

Kann ich dir nicht mehr genau sagen.

Ich habe viel herum probiert und immer Warnungen bekommen. Ein Error war 
glaub ich gar nicht dabei.

Es drehte sich immer um unterschiedliche Datentypen bzw. 
unterschiedliche Anzahl von Dereferenzierungen.

von Grrrr (Gast)


Lesenswert?

Mouse schrieb:
>>Moment mal, habe ich was falsch verstanden?
>>
>>Was war die genaue Fehlermeldung bei Deinem ersten Versuch?
>
> Kann ich dir nicht mehr genau sagen.

Dann bitte Zustand wieder herstellen, kompilieren und Meldung posten.

von Rolf Magnus (Gast)


Lesenswert?

Mouse schrieb:

> Wenn ich jetzt die Adresse von a an pa übergeben will, geht das so:
>
> pa = &a;
>
> Warum gilt hier nicht, dass der Name des Arrays ein Zeiger auf sein
> erstes Element ist?
>
> pa = a; //Fehler

pa ist ein Zeiger auf arraytype, nicht ein Zeiger auf ein Element davon. 
Um das zu verdeutlichen, braucht man keine zweidimensionalen Arrays. Mit 
einem normalen Array ist es einfacher zu erklären:
1
typedef int arraytype[10];
2
arraytype a;   // Typ int[10]
3
arraytype *pa; // Typ Zeiger auf int[10], nicht Zeiger auf int!
4
int*       pi; // Typ Zeiger auf int
5
6
pa = &a;       // a ist int[10], pa ist Zeiger auf int[10], also braucht
7
               // man den Adress-Operator
8
pi = a;        // Hier wird das Array in einen Zeiger auf sein erstes
9
               // Element konvertiert, daher ohne Adress-Operator

von Grrrr (Gast)


Lesenswert?

Ach, das wird mir jetzt doch zu langweilig. :-)

Es ist doch ganz einfach. Wenn der Name eines Arrays die Adresse des 
ersten Elementes zurückgibt, dann ist der ein Zeiger auf einen Wert mit 
dem Typ den auch die Array-Elemente haben, oder?
1
arraytype a;
2
int *pa;
3
pa = &a;

von Mouse (Gast)


Lesenswert?

>Es ist doch ganz einfach. Wenn der Name eines Arrays die Adresse des
>ersten Elementes zurückgibt, dann ist der ein Zeiger auf einen Wert mit
>dem Typ den auch die Array-Elemente haben, oder?

Ja hab's verstanden. Ich bin davon ausgegangen, dass der Compiler einen 
Schritt weitergeht und aus einem Pointer auf int[10] einen Pointer auf 
das erste Element eines int[10] macht, um den Arraynamen so verwenden zu 
können wie immer.

Rein logisch ist es natürlich klar, dass ein Zeiger auf ein Array vom 
Typ Int nicht das selbe ist wie ein Zeiger auf das erste Element eines 
Arrays vom Typ Int, da im ersten Fall sozusagen auf 10 aufeinander 
folgende Elemente gezeigt wird und im zweiten Fall nur auf eines.

In deinem Beispiel könnte man aber, wie Rolf Magnus gezeigt hat, auch 
auf den Adressoperator verzichten, da du den Pointer als int* angelegt 
hast:

arraytype a;
int *pa;
pa = a;

von Karl H. (kbuchegg)


Lesenswert?

Mouse schrieb:

> Arrays vom Typ Int, da im ersten Fall sozusagen auf 10 aufeinander
> folgende Elemente gezeigt wird und im zweiten Fall nur auf eines.

Ganz genau.
Jetzt hast du's.

Durch den Datentyp hast du dem Zeiger de facto noch eine zusätzliche 
Information 'aufgebrannt'. Nämlich dass da 10 Elemente sind, oder im 
Originalposting eben 10*10 Elemente. Daher darf man in diesem Fall nicht 
einfach irgendeinen dahergelaufenen Zeiger zuweisen. Und sei es nur weil 
ein Arrayname automatisch zu einem einfachen Pointer degeneriert.

von Grrrr (Gast)


Lesenswert?

Mouse schrieb:
> Ich bin davon ausgegangen, dass der Compiler einen
> Schritt weitergeht und aus einem Pointer auf int[10] einen Pointer auf
> das erste Element eines int[10] macht, um den Arraynamen so verwenden zu
> können wie immer.

Aber wie würdest Du dann absichtlich nur einen Pointer auf int[10] 
erzeugen?

Mouse schrieb:
> Rein logisch ist es natürlich klar, dass ein Zeiger auf ein Array vom
> Typ Int nicht das selbe ist wie ein Zeiger auf das erste Element eines
> Arrays vom Typ Int,
Nein. Das ist das selbe.

> da im ersten Fall sozusagen auf 10 aufeinander
> folgende Elemente gezeigt wird und im zweiten Fall nur auf eines.
Das wird vom Compiler nicht beachtet und war auch nicht Dein Problem.

von Grrrr (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Durch den Datentyp hast du dem Zeiger de facto noch eine zusätzliche
> Information 'aufgebrannt'.

Ooops. Das wird im typedef mitgenommen. Sorry.
K.-H. B. hat recht.

von Grrrr (Gast)


Lesenswert?

Der "kleine" Heinz. Hihi.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.