Häufig werden for-Schleifen bei Feldvariablen eingesetzt. Mit ihr gelingt es sehr einfach die indexierten Feldvariablen einzeln anzusprechen.
Übung 1
Programm A10_01.c
Wie arbeitet das Programm A10_01.c?
Zeile 9
Das Hauptprogramm initialisiert zu Beginn ein Feld "p" mit sechs Elementen: 1 und die ersten fünf Primzahlen.
Zeile 10
Die for-Schleife startet mit den Parametern: Startwert: i=0, Bedingung: i<6 und Inkrement: i++
.
Zeile 12
Die print-Anweisung gibt bei jedem Schleifendurchlauf die angesprochene Feldvariable mit dem ihr zugewiesenen Wert aus. Beim ersten Schleifendurchlauf wird aus:
auf dem SimpleIDE Terminal erscheint p[0] = 1.
Der zweite Schleifendurchlauf ergibt:
Die for-Schleife zählt bis zur Zahl 5 hoch und stellt alle Werte, die in den Feldvariablen abgelegt waren, auf dem Terminal dar. Das letzte Element ist p[5] = 11.
Was du wissen solltest!
sizeof
C verfügt über einen unitären Operator sizeof, der die Bytezahl auswirft, die von einem Objekt, wie zum Beispiel einem Array, im Speicher benötigt wird.
Im letzten Beispielprogramm wussten wir, dass das Feld 5 Elemente enthält und wählten als Schleifenbedingung i < 6, um auf alle Feldelemente zugreifen zu können. Wie müssen wir vorgehen, wenn wir die Anzahl der Feldelemente nicht kennen? Das folgende Beispiel zeigt eine Lösung:
for(int i = 0; i < sizeof(p)/sizeof(int); i++)
sizeof(p) gibt die Gesamtspeicherzahl in Bytes des Feldes p an, sizeof(int) gibt die Bytes an, die von einem Feldelement benötigt werden. Dann gibt der Quotient: sizeof(p)/sizeof(int) die Zahl der Elemente in einem Feld an.
Übung 2
Übung 3
Schreibe ein Programm, das jedes Feldelement mit 100 multipliziert und das Ergebnis in die Feldvariablen zurückschreibt. Gib in einer zweiten Schleife alle Feldinhalte auf dem Terminal aus. Wenn keine Fehler gemacht wurden, sollte die zweite Schleife die Werte: 100, 200, 300, 500, 700, 1100, etc. anzeigen.
Bisher hat uns nur interessiert, welche Werte in Variablen abgespeichert sind. Es gibt aber eine Reihe von nützlichen Funktionen in der Sprache C++, die gerne wüssten, wo die Werte einer Variablen innerhalb des RAM (Random Access Memory) abgelegt wurden.
Um uns nun auf die folgenden Übungen vorzubereiten, die diese Funktionen benutzen, schauen wir uns erst einmal an, wie man die Adresse einer Variablen innerhalb des RAM bestimmt. Dies erfolgt durch
das Voranstellen des Operators & beim Variablennamen.
Übung 4
Programm A11_01.c
In dem folgenden Testprogramm wird der int Variablen mit Namen Variable der Wert 123 zugewiesen. Die Adresse, unter der dieser Wert im RAM abgelegt wird, erscheint im Terminal. Anschließend wird der Variablen ein neuer Wert zugewiesen und im Terminal wiederum die RAM-Adresse ausgegeben.
Übung 5
Programm A11_02.c
Wie arbeitet das Programm A11_02.c?
Zeile 9
Das Programm startet mit der Deklaration einer int-Variablen mit Namen Variable und weist ihr den Initialisierungswert 123 zu.
Zeile 10 und 11
Der erste print Aufruf gibt den Wert aus. Die Adresse unter der dieser Wert im RAM abgelegt wurde, wird über &variable erreicht. Die Adresse gibt die Anzahl Bytes an gezählt vom
Beginn des Haupt-RAM.
Zeile 12
Nach einer neuen Zuweisung an die Variable variable wird in …
Zeile 13 und 14
der neu zugewiesene Wert und in einer weiteren Zeile die neue Adresse der Variablen ausgegeben. Die neue Adresse der Variablen ist die alte.
Was du wissen solltest!
Die Adressen im Haupt RAM des Propeller werden als Byte-Adressen angegeben; sie geben an, um wie viel Bytes vom Beginn des Haupt-RAM- Bereichs die Adresse liegen. Diese Art der Darstellung gilt für die Datentypen INT, SHORT, BYTE und FLOAT.
Mit dem &-Operator lassen sich auch die Adressen von Feldvariablen bestimmen. Gegeben sei das folgende Array:
int array[5] = {11, 13, 17, 19, 23};
Die Ermittlung der Adresse des dritten Feldelementes (enthält die Zahl 19!) wird auch hier durch das Voranstellen des &-Operators eingeleitet:
print("array[3] address = %d \n", &array[3]);
Die Ermittlung der Adresse des nullten Feldelements (enthält die Zahl 11) kann auf zweierlei Art angegangen werden: entweder durch das Voranstellen des &-Operators oder durch den Aufruf des Feldnamens. Hier die beiden Darstellungen:
print("array[0] address = %d \n", &array[0]);
print("array[0] address = %d \n", array);
Jedes Feldelement in einem Array vom Typ int benötigt 4 Bytes. Die Adresse eines zweiten Elementes ist also immer um 4 höher als die des ersten Elementes und so weiter. Char-Felder, bei denen jedes Element nur ein Byte benötigt, unterscheiden sich deshalb von den int-Feldern
Wir überprüfen, ob jedes Feldelement vom Typ int tatsächlich vier Bytes benötigt und das die Startadresse eines Feldes auch über &array[0] aufgerufen werden kann.
Übung 6
Programm A11_03.c
TIPP: Die Adressausgabe des ersten Feldelementes wird häufig nur über den Feldnamen-Aufruf array statt über &array[0] initiiert.
Jetzt kommst du!
Im dieser Lektion wurde erwähnt, dass ein Feld vom Typ char pro Feldelement ein Byte benötigt. Das soll mit der folgenden Aufgabe überprüft werden.