Hallo!
Java kann *ich* nicht beurteilen, weil ich es nicht wirklich kenne - und PHP kommt mir immer geheimnisvoll und schwer durchschaubar vor, weil ich zuerst Assembler, dann C gelernt habe und gewöhnt bin, maschinennah zu denken und jeden einzelnen Schritt sehen möchte. Sprachen wie PHP oder auch schon C++ machen für meinen Geschmack schon zuviel "von allein", ohne dass es für den Betrachter offensichtlich ist. Das ist gut für jemanden, der schnell das Wesentliche erkennen und erreichen will, aber schlecht für jemanden, der jeden einzelnen Schritt verstehen möchte.
da sind wir uns sehr ähnlich. Ich möchte auch immer jeden Schritt wissen, sonst kapier ich es auch gar nicht so richtig. Deshalb macht mir C gerade so richtig Spaß.
falls ich das Feld und nicht den Zeiger übergeben möchte, würde ich prinfField(field[0][0]) schreiben?
Damit übergibst du das erste Arrayelement. Die Information über die Dimensionen des Arrays geht dabei ebenso verloren wie die Information, dass es überhaupt Teil eines Arrays ist.
Jetzt hab ich es geschnallt. Man muss nur etwas um- und dabei an den Speicherbereich denken.
Ferner ist die Funktion so angelegt, dass sie selbst "weiß", dass es sich beim übergebenen int-Zeiger um einen Zeiger auf das erste von 16 int-Elementen handelt, die logisch als 4 Gruppen zu je 4 Elementen gesehen werden sollen.
ist das schlecht?Nein, es ist eine gängige Vorgehensweise, weil bei der Übergabe von Arrays als Funktionsparameter in C nur ein Zeiger auf das Array übergeben wird und jegliche Information über die Struktur verlorengeht. Wollte man eine Funktion schreiben, die mit Arrays beliebiger Größe arbeiten kann, müsste man ihr die Dimensionen des Arrays als zusätzliche Parameter übergeben, während diese Information in anderen Sprachen als Eigenschaft am Array selbst "dranhängt".
Das heisst also, ob ich einen Array übergebe oder nur einen Pointer auf das erste Element, ist egal?
(1) Der Ausdruck
f[a+4*b]
bedeutet:
Berechne a+4*b und nimm den als Index. Lies dann das Element aus dem Array f, das durch diesen Index adressiert wird.
ok, ist klar.
(2) Der Ausdruck
*(f+a+4*b)
bedeutet:
Berechne a+4*b und gehe dann, ausgehend vom Zeiger f, um genau soviele Elemente im Speicher weiter. Lies das Element, zu dem du auf diese Weise kommst.
ist jetzt auch klar. Das Sternchen * rückentwickelt also den Ausdruck und gibt mir den Wert. Lasse ich das Sternchen weg, bekomme ich die Adresse.
Der Knackpunkt ist, dass der bloße Bezeichner eines Arrays gleichbedeutend ist mit einem Zeiger auf das erste Element des Arrays. Daher ist &f[0] (Adresse des Arrayelements 0) dasselbe wie f (Basisadresse des Arrays f), und f[1] (Wert des Arrayelements 1) dasselbe wie *(f+1) (Inhalt des Speichers, auf den f verweist, um ein Element erhöht).
verstehe. Bei *(f+n) wandere ich also n Schritte vor im Speicher. Kann man so auch in Speicherbereiche gelangen, die eigentlich nicht zu f gehören? Wäre das ein Buffer-overflow?