Uff mit dem Pointern tu' ich mir immer noch/wieder etwas schwer.
Wie gesagt, palette ist ein Zeiger auf ein Aaray, dessen Grösse erst zur
Laufzeit ermittelt wird, also:
1
structrgbtriple(*palette)[];// Zeiger auf Array mit unbestimmter Groesse
Pointer auf Array deferenzieren, dann Index, dann Element aus struct,
also:
Hacker schrieb:> Uff mit dem Pointern tu' ich mir immer noch/wieder etwas schwer.
Vielleicht hilft dir die Erkenntnis, dass bei
int a[10];
der Name "a" vom Typ her nicht für ein Array steht, sondern für einen
Pointer auf das erste Element. Das ist ein bischen schräg, aber so ist C
eben.
Infolgedessen ist bei
Hacker schrieb:> Wohl doch nicht? Wenn ich wie eben hergeleitet so dereferenziere:
Funktioniert auch, ist aber ein ausgesprochen unüblicher Weg und sieht
auch recht hässlich aus.
Hacker schrieb:> Wie gesagt, palette ist ein Zeiger auf ein Aaray, dessen Grösse erst zur> Laufzeit ermittelt wird, also:
Ja, aber ein simples "struct rgbtriple *palette;" erledigt das gleiche,
und ist weniger kompliziert, sowohl bei der Deklaration, wie auch beim
Zugriff.
> Das ist doch dasselbe wie>> palette[c]->r
Nein. Wenn palette ein Pointer auf ein Array ist, dann ist palette[c]
das c-te Array in einem Array solcher Arrays.
Merke dir: "x[y]" ist immer das Gleiche wie "*(x+y)".
Wenn er jetzt noch verstanden hat, dass er deshalb in seiner Version
genauso gut
c[*palette].r
schreiben kann, dann hat er das Thema Arrays&Pointer durch. ;-)
Hacker schrieb:> Somit ist das dasselbe?
Nein. Nur taucht in C der von dir so verzweifelt geklammerte Datentyp
"Array" eher selten auf. Meist hat man es mit Pointern auf die Elemente
zu tun, auch wenns nur der auf das erste Element ist.
> (*palette)[c].r
palette ist array und passt zu
struct rgbtriple (*palette)[];
> palette[c].r
pallete ist pointer auf erstes Element und passt zu
struct rgbtriple *palette;
A. K. schrieb:> Nein. Nur taucht in C der von dir so verzweifelt geklammerte Datentyp> "Array" eher selten auf. Meist hat man es mit Pointern auf die Elemente> zu tun, auch wenns nur der auf das erste Element ist.
Ahhh jetzt ist klar, dankeschön.
Hacker schrieb:> Ahhh jetzt ist klar, dankeschön.
Das glaubst du nur. Denn hier sieht man mal wieder sehr schön, daß man
nicht alles glauben darf, was im Internet steht.
Dieser Thread ist eine Ansammlung von Halb- und Unwahrheiten, zum Haare
raufen.
Wenigstens sind die Leute hilfsbereit gewesen.
Dennoch an dich den ernstgemeinten Rat: Lerne C. Richtig. Nicht auf
dieser Ebene von "wir fummeln das mal so hin, daß irgendwas tut und
erfinden uns dann eine Begründung, warum es tut".
Zur Sache:
Peter II schrieb (und wurde bereits korrigiert):
| struct rgbtriple *palette;
Das ist natürlich großer Käse. C-Deklarationen sind auf den ersten Blick
sehr kompliziert, auf den zweiten aber gar nicht.
Lesetipp:
http://www.ericgiguere.com/articles/reading-c-declarations.html
Zum schnellen Anwenden in der Praxis: http://www.cdecl.org
Du selbst schriebst:
| Pointer auf Array deferenzieren, dann Index, dann Element aus struct,
| also:
|
| (*palette)[c].r
|
| Das ist doch dasselbe wie
|
| palette[c]->r
Nein, palette[c] ist offensichtlich schon Käse, denn palette ist kein
Array, sondern ein Zeiger auf ein Array.
Dann schrieb A.K.:
| Vielleicht hilft dir die Erkenntnis, dass bei
| int a[10];
| der Name "a" vom Typ her nicht für ein Array steht, sondern für einen
| Pointer auf das erste Element. Das ist ein bischen schräg, aber so ist C
| eben.
Das wäre tatsächlich ein bißchen schräg. Glücklicherweise ist die
Behauptung schon Unfug.
a ist in der Deklaration ein Array. Kein Zeiger. Und damit auch kein
"Zeiger auf das erste Element".
| Infolgedessen ist bei
|
| int a[];
| int *p;
|
| von den Datentypen her dies beides gleich:
|
| a[i];
| p[i];
ist daher auch falsch.
A.K. kommt gleich nochmal:
| Wenn er jetzt noch verstanden hat, dass er deshalb in seiner Version
| genauso gut
| c[*palette].r
| schreiben kann, dann hat er das Thema Arrays&Pointer durch. ;-)
und bringt damit das am häufigsten genannte "Herr Lehrer, ich weiß
was!"-Gimmick aller Sprachen. Außerhalb von http://www.ioccc.org/ hat in
den Jahrzehnten, in denen nun schon C programmiert wird, noch niemand
einen Anwendungszweck für diese Kommutativität gefunden.
Und schließlich nochmal A.K.:
| Nein. Nur taucht in C der von dir so verzweifelt geklammerte Datentyp
| "Array" eher selten auf. Meist hat man es mit Pointern auf die Elemente
| zu tun, auch wenns nur der auf das erste Element ist.
Wie oben bereits erwähnt: C hat im Gegensatz zum Irrglauben vieler sehr
wohl Arrays. Und sie tauchen keineswegs selten auf.
Lediglich in ganz bestimmten Kontexten "zerfallen" Arrays ("decays") zu
Zeigern auf ihr erstes Element. In formalen Parametern beispielsweise.
Zuguterletzt noch ein Lesetipp: http://www.c-faq.com
Speziell Kapitel sechs.
Schönen Abend und noch viel Freude mit C.
Martin schrieb:> a ist in der Deklaration ein Array. Kein Zeiger. Und damit auch kein> "Zeiger auf das erste Element".
"a" ist vor der Deklaration her ein Array, aber nicht, wenn der Name
unverziert in einem Ausdruck steht. Dann ist es vom Datentyp her ein
Pointer, ausser wenn es in sizeof steht.
> | a[i];> | p[i];>> ist daher auch falsch.
Auch hier war die Verwendung gemeint, nicht die Deklaration.
> und bringt damit das am häufigsten genannte "Herr Lehrer, ich weiß> was!"-Gimmick aller Sprachen.
Das war halb Jux halb ernst, denn wie schon davon vom jemanden skizziert
wird ist a[i] identisch mit *(a+i) und es hilft sehr, wenn man sich das
gelegentlich vor Augen führt. Die Kommutativität ist nur eine kuriose
Folge davon, die von mir auch sprachlich nicht den Fragesteller
adressierte.
> Wie oben bereits erwähnt: C hat im Gegensatz zum Irrglauben vieler sehr> wohl Arrays. Und sie tauchen keineswegs selten auf.
Hättest du ein repräsentatives Beispiel für C Expressions, in dem der
Datentyp(!) Array ausserhalb sizeof/cast auftaucht? Grad sizeof ist auch
nicht unbedingt sehr logisch, denn in sizeof(a) ist a ein Array, in p=a
oder *a aber ein Pointer.