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.
Kein Wunder das K.-H.B. casts für Pfui hält. Sind verführerischerer die Dinger als ich dachte
Moment mal, habe ich was falsch verstanden? Was war die genaue Fehlermeldung bei Deinem ersten Versuch?
>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 | 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
|
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; |
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.