Der Martin: C - Zeigerfrage Array

Beitrag lesen

n'Abend!

In PHP und Java war das Handling immer irgendwie simpel. Obwohl natürlich mehr dahintersteckt..

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.

falls ich das Feld und nicht den Zeiger übergeben möchte, würde ich prinfField(field[0][0]) schreiben?

Verflucht, da habe ich mich mit der Nomenklatur vertan. Der Begriff "Feld" wird in der deutschsprachigen Fachliteratur manchmal als Übersetzung für "Array" verwendet - ich meinte mit "Feld" aber das einzelne Element eines Arrays. Also nochmal:

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.

Du deklarierst also eine Funktion, die einen Zeiger auf ein int erwartet. Ob das ein Zeiger auf eine einzelne int-Variable ist, oder ein Zeiger auf ein beliebiges(!) Element eines int-Arrays, ist syntaktisch wieder egal.
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".

printf("%d ", *(field+i*4+y));
printf("%d ", field[i*4+y]);
verstehe... so langsam. Ich verstehe nur noch nicht 100%, warum ich hier field nutze und nicht *field.

(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.

(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.

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).

würde ich keinen Zeiger übergeben, sondern das Array:
void printField(int field)

So übergibst du kein Array, sondern einen einzelnen int-Wert.

So long,
 Martin

--
Vielseitigkeit: Von vielen Dingen keine Ahnung haben.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(