Übungsaufgaben
Zehn Übungen zum Klicken, Zuordnen, Nachverfolgen und Knobeln — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du nicht weiterkommst, helfen dir die gestuften Tipps.
Ordne jeder Schreibweise ihre Bedeutung zu. Die Byte-Angaben gelten für einen typischen PC.
0x10 für zehn halten. Das Präfix 0x kündigt eine Hexadezimalzahl an: 1 · 16 + 0 = 16. Und ¬e ist nicht der Wert von note, sondern die Nummer der Speicherzelle, an der er steht.& vor einem Variablennamen fragt: „Wo liegst du?“Eine int-Variable belegt ab Adresse 0x2FFC typischerweise 4 Byte. Gib die Adresse ihres letzten Bytes an.
Fünf Behauptungen über den Arbeitsspeicher. Nenne jeweils, ob sie stimmt.
& bekommt scanf nur den (zufälligen) Wert der Variablen und schreibt an eine unsinnige Stelle — meist stürzt das Programm ab. Bei printf ist es umgekehrt: Dort genügt der Wert.0x.double t; // Fahrzeit int m; // Meter char k; // Kennbuchstabe int z; // Zähler
Nimm vereinfacht an, dass die Variablen lückenlos in dieser Reihenfolge ab Adresse 0x2000 liegen und die typischen Größen haben. Bestimme für jede Variable Größe, erste und letzte Adresse.
| Variable | Byte | erste Adresse | letzte Adresse |
|---|---|---|---|
double t; | |||
int m; | |||
char k; | |||
int z; |
char sind erste und letzte Adresse gleich. Echte Compiler lassen oft Lücken, damit int und double auf „glatten“ Adressen liegen — deshalb „vereinfacht“.t: 8 Byte ab 0x2000 enden bei 0x2007.int x = 7; double preis = 1.5; char zeichen = 'M';
Ordne jeden Ausdruck danach ein, was er liefert.
x + 1: Das ist schlicht 8 — ein Wert, keine Adresse. Und &zeichen ist eine Adresse wie jede andere, obwohl dort nur 1 Byte liegt. sizeof fragt nie nach dem Inhalt: sizeof(x) ist 4, egal ob x gerade 7 oder 7000 ist.& davor macht aus jeder Variablen eine Adresse.sizeof beantwortet „wie viel Platz?“, nicht „was steht drin?“.Alter: 14 Du bist 14 Jahre alt. alter liegt bei 0x7ffd3a1c
Ergänze die Lücken so, dass das Programm wie gezeigt arbeitet.
int alter; printf("Alter: "); scanf("", ); printf("Du bist %d Jahre alt.\n", ); printf("alter liegt bei \n", );
scanf braucht die Adresse (wohin schreiben?), printf mit %d den Wert. Typischer Fehler: auch in der ersten Ausgabe &alter schreiben — dann erscheint eine riesige Zahl statt 14, und gcc warnt. Für Adressen ist %p die richtige Formatangabe.Die Schul-Wetterstation hat für Messwerte den Speicherbereich von 0x2A00 bis einschließlich 0x2AFF reserviert. Berechne Schritt für Schritt (typische Größen).
- Wie viele Byte umfasst der Bereich? Byte
-
Wie viele
int-Werte passen hinein? -
Wie viele
double-Werte passen hinein? -
Bei welcher Adresse beginnt der letzte
int-Wert?
int belegt die letzten 4 Byte 0x2AFC bis 0x2AFF.Das Programm für den Punktestand im Spiel soll Punkte einlesen, sie mit Bonus ausgeben und zeigen, wo die Variable im Speicher liegt. Untersuche den Code — drei Zeilen sind fehlerhaft.
-Wall alle als Warnung — und übersetzt trotzdem. Korrekt ist dagegen Zeile 8: Der cast (int) passt das Ergebnis von sizeof an %d an. Zeile 7 ist das richtige Muster für die Adressausgabe.scanf ↔ Adresse, %d ↔ Wert, %p ↔ Adresse.Mit der do … while-Schleife aus 2.1.3 und scanf soll ein Programm Zahlen einlesen, bis 0 eingegeben wird, und dann die Summe ausgeben. Für die Eingaben 4, 7, 0 erscheint Summe: 11. Implementiere das Programm, indem du die Zeilen ordnest.
summe += zahl; vor das scanf: Dann wird im ersten Durchlauf ein noch unbestimmter Wert addiert. Die abschließende 0 wird mitaddiert — das schadet nicht. Genau dafür passt do … while: Die Bedingung kann erst geprüft werden, nachdem einmal eingelesen wurde.zahl != 0 steht bei do … while hinter dem Rumpf.double x = 1.5; char k = 100;
Lege für jeden Ausdruck fest, welchen Wert er auf einem typischen PC hat.
sizeof(int)
sizeof(2.5)
sizeof(int) + sizeof(double)
sizeof(10 / 4)
sizeof(10 / 4.0)
sizeof(x) * 2
sizeof(k)
sizeof misst den Typ eines Ausdrucks, nicht seinen Wert. 10 / 4 ist ein int (Wert 2) → 4 Byte; 10 / 4.0 ist ein double → 8 Byte; die Zahl 2.5 ist ebenfalls ein double. Die Falle: sizeof(k) ist 1, obwohl in k die Zahl 100 steht — ein char belegt immer 1 Byte.int, double oder char?2.5 hat den Typ double.