Über einen Zeiger lesen
Ein Zeiger weiß, wo eine Variable ist. Um den Wert aus diesem Kästchen zu holen, schreibe ein * vor den Zeiger: *p bedeutet „der Wert, auf den p zeigt“. Einen Wert von einer Adresse zu holen heißt, einen Zeiger zu dereferenzieren.
#include <stdio.h>
int main(void) {
int alter = 15;
int *p = &alter;
printf("%d\n", *p);
printf("%d\n", *p + 1);
return 0;
}Das gibt aus:
15
16*p ist ein int, also gibst du es mit %d aus und rechnest damit wie mit jeder Ganzzahl.
& und * sind Gegenstücke. & fragt „Wo ist es?“ und macht aus einer Variablen ihre Adresse. * fragt „Was ist dort?“ und macht aus einer Adresse wieder den Wert. Deshalb ist *&alter einfach wieder alter.
Ein Zeiger behält keine Kopie des Werts. Er kennt nur die Adresse, und *p schaut jedes Mal ins Kästchen. Wenn sich die Variable ändert, gibt *p also den neuen Wert:
int alter = 15;
int *p = &alter;
alter = 16;
printf("%d\n", *p);Das gibt aus:
16Der Stern hat jetzt drei Bedeutungen. Entscheidend ist, wo er steht:
- In einer Deklaration, nach einem Typ:
int *p = &alter;legt einen Zeiger an. Hier sagt der Stern „pist ein Zeiger“. - Vor einem Zeiger, an jeder anderen Stelle:
*pist der Wert, auf den er zeigt. - Zwischen zwei Werten:
preis * 2ist eine Multiplikation, wie immer.
*p * 2 bedeutet also „der Wert, auf den p zeigt, mal zwei“. Der erste Stern holt den Wert von der Adresse, der zweite multipliziert.
Der typische Fehler ist, den Stern zu vergessen. Dann arbeitest du mit der Adresse statt mit dem Wert, und der Compiler sagt es dir:
printf("%d\n", p);endet mit dem Fehlerformat specifies type 'int' but the argument has type 'int *':%derwartet einenint, aberpist eine Adresse.p * 2endet mit dem Fehlerinvalid operands to binary expression ('int *' and 'int'). Operanden sind die Werte um einen Operator herum, hierpund2, und eine Adresse kannst du nicht multiplizieren.
So schreibst du es:
Anweisungen
- 1
Das Programm lässt sich nicht kompilieren. Lies die Fehlermeldung und korrigiere das letzte
printfso, dass es den Wert ausgibt, auf denpzeigt, nicht die Adresse. Das Programm gibtPunkte: 50undÜber den Zeiger: 50aus. - 2
Gib darunter die doppelten Punkte aus, wieder über den Zeiger: den Text
Doppelt:und*p * 2. Das Programm gibt in der nächsten ZeileDoppelt: 100aus. - 3
Ändere danach die Punkte direkt, ohne den Zeiger:
punkte = 60;. Gib dann den TextJetzt:und*paus. Der Zeiger gibt den neuen Wert:Jetzt: 60.