MINT üben

Zeiger

Ein Fahrradcomputer, der Werte über Zeiger verändert, und ein Tischtennis-Zähler, dessen Punkte einfach nicht steigen wollen.

Dein Fortschritt:
0 / 0 Aufgaben
1

Ein Fahrradcomputer im Test

AFB I–II

Jonas baut für sein Fahrrad einen kleinen Fahrradcomputer. Bevor er Sensoren anschließt, testet er auf dem PC, wie Werte über einen Zeiger verändert werden. Das Programm speichert die gefahrene Strecke in Kilometern und die Durchschnittsgeschwindigkeit in km/h.

Die Skizze zeigt den Speicher vereinfacht direkt nach Anweisung (1). Die Adressen sind ausgedacht; beim echten Programm ändern sie sich bei jedem Start.

C · fahrrad.c
#include <stdio.h>

int main(void)
{
    int strecke = 12;        // gefahrene Kilometer
    int tempo = 18;          // Durchschnitt in km/h
    int *z = &strecke;       // (1)
    *z = *z + 5;             // (2)
    z = &tempo;              // (3)
    *z = 2 * *z;             // (4)
    printf("%d %d %d\n", strecke, tempo, *z);
    return 0;
}
Speicher nach Anweisung (1)
12streckeAdr. 0x2000int · 4 Byte18tempoAdr. 0x2004int · 4 Byte0x2000zAdr. 0x2008int * · 8 Bytez zeigt auf strecke
Vereinfachte Adressen; ein int belegt hier typisch 4 Byte, ein Zeiger 8 Byte.
  1. Beschreiben Sie, was die Anweisungen (1) bis (4) jeweils bewirken.
  2. Bestimmen Sie die Ausgabe des Programms sowie die Adresse, die am Ende in z steht (Adressen wie in der Skizze).
  3. Erklären Sie, warum Jonas’ spätere Ergänzung int umfang; scanf("%d", umfang); für den Radumfang fehlerhaft ist, und wie die Zeile richtig lautet.

Hinweise

Hinweis zu Aufgabe a)
Unterscheiden Sie genau: Steht vor z ein Stern oder nicht? Ohne Stern ist die Adresse gemeint, mit Stern der Wert an dieser Adresse. In der Deklaration (1) gehört der Stern dagegen zum Typ.„Beschreiben“ heißt: jede Anweisung in eigenen Worten mit Fachbegriffen wiedergeben, noch ohne Endergebnis.
Hinweis zu Aufgabe b)
Führen Sie eine kleine Tabelle mit den Spalten strecke, tempo und z und tragen Sie nach jeder Anweisung die Werte ein.
Hinweis zu Aufgabe c)
Was braucht scanf, um einen Wert in eine Variable von main schreiben zu können — den bisherigen Inhalt oder den Ort der Variablen? Vergleichen Sie mit *z = … aus Anweisung (2).