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.
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.
>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.
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.
>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.
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.
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
typedefintarraytype[10];
2
arraytypea;// 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
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?
>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;
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.
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.
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.
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.