Wie eine Struktur initialisieren?

Ich seh schon, da hab ich noch einiges zu lernen... :confused:

Sorry wenn ich Euch damit auf den Sack gehe, aber ich habe echt noch Schwierigkeiten das zu verstehen! Als PHP-Skripter muss man sich über solche Dinge kaum Gedanken machen...

Ich würde gern nochmal einen Schritt zurück und mit Zeigern anfangen, ob ich das alles richtig verstanden habe. Ich schreib einfach mal als ob ich es jemand anderem erklären müsste und ihr könnt das dann bitte korrigieren, kommentieren oder ergänzen:

Wenn man mit

char len;

eine Variable definiert, dann weiss der Compiler zunächst nur von welchem Typ sie ist und wie sie heißt. Auch wird er für den Wert der Variable eine entsprechende Anzahl Bytes im Arbeitspeicher reservieren. An der Speicheradresse können aber irgendwelche Daten liegen, da ich den Wert nicht initialisiert oder sonst irgendwie zugewiesen habe.

Sobald ich dieser Variablen einen Wert zuweise:

len = 8;

wird an der Speicherstelle der in der Variablen für den Wert vorgesehen ist, dieser neue Wert abgelegt. Somit ist der Name einer Variablen eigentlich nichts anderes wie ein Synonym für eine Speicheradresse.

Stellt man dem Variablennamen den Dereferenzierungsoperator "&" voran ("&len"), liefert dies nicht den Wert sondern die Speicheradresse des Wertes.

Durch voranstellen eines "*" bei der Deklaration einer Variablen wird festgelegt, das an der Speicheradresse dieser nicht der Wert sondern eine Speicheradresse auf den Wert zu finden ist:

char *p;

In eine solche Variable kann man nun eine Speicheradresse eines Wertes hineinkopieren:

p = &len;

Wichtig ist, das der Zeiger vom gleichen Typ ist wie die Variable selbst.

Nun zeigt "p" indirekt auf die gleiche Speicheradresse wie "len". Indirekt bedeutet, das die Variable "p" nicht wie eine normale Variable direkt auf die Speicheradresse von "len" zeigt, sondern auf eine Speicheradresse an der die Speicheradresse von "len" liegt. Dadurch kann man auch nicht direkt mit "p = ..." arbeiten, wie es mit "len" tun würde, sondern muss dereferenzieren. Um also den Wert von "len" über die Zeigervariablen "p" ändern zu wollen müsste man so schreiben:

*p = 3;

Für den Compiler bedeutet das: Ermittele die Speicheradresse vom Typ char an der durch p definierten Stelle und weise dieser den Wert 3 zu.

Mit dieser Methode kann man also die Speicheradressen von Variablen an Funktionen übergeben. Diese können dann die Werte darin direkt verändern. Dies ist hilfreich wenn man möchte das die funktion einen vorhandenen Wert ändert, oder einen noch nicht definierten Wert erzeugt:

void changeval ( char *p ) {
    *p = 8;
}

char len = 4;
changeval(&len);

char len2;
changeval(&len2);