www.mikrocontroller.net

Forum: Compiler & IDEs Adressübergabe zweidimensionales Array


Autor: Mouse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mouse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

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

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moment mal, habe ich was falsch verstanden?

Was war die genaue Fehlermeldung bei Deinem ersten Versuch?

Autor: Mouse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef int arraytype[10];
arraytype a;   // Typ int[10]
arraytype *pa; // Typ Zeiger auf int[10], nicht Zeiger auf int!
int*       pi; // Typ Zeiger auf int

pa = &a;       // a ist int[10], pa ist Zeiger auf int[10], also braucht
               // man den Adress-Operator
pi = a;        // Hier wird das Array in einen Zeiger auf sein erstes
               // Element konvertiert, daher ohne Adress-Operator

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
arraytype a;
int *pa;
pa = &a;

Autor: Mouse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der "kleine" Heinz. Hihi.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.