Die Zeichen & und *
Du kennst jetzt für jedes der Zeichen & und * zwei Bedeutungen, und Anfänger verwechseln sie oft. Entscheidend ist, wo sie stehen:
- In einer Deklaration, wenn du eine Variable oder einen Parameter erstellst, stehen sie direkt hinter dem Typ und sind Teil des Typs. Lies
int&als „Referenz auf einen int“ undint*als „Zeiger auf einen int“. - In einem Ausdruck, also Code, der etwas berechnet, zuweist oder ausgibt, stehen sie vor dem Namen einer Variablen und machen etwas mit ihr.
& | * | |
|---|---|---|
| In einer Deklaration (hinter einem Typ) | int& r = x; Referenz: r ist ein weiterer Name für x | int* p = &x; Zeiger: p enthält die Adresse einer int-Variablen |
| In einem Ausdruck (vor einer Variablen) | &x ist die Adresse der Variablen x | *p ist die Variable, auf die p zeigt |
Und steht * zwischen zwei Werten, wie in preis * 2, ist es die gewöhnliche Multiplikation. Das doppelte && kennst du aus Bedingungen, wo es „und“ bedeutet. Dieses Beispiel enthält fast alle Bedeutungen:
#include <iostream>
int main() {
int x = 5;
int& r = x; // Deklaration: r ist eine Referenz auf x
int* p = &x; // Deklaration: p ist ein Zeiger; Ausdruck &x: Adresse von x
*p = r * 2; // Ausdruck: *p ist die Variable x, r ist auch x, * dazwischen multipliziert
std::cout << x << std::endl;
return 0;
}Das gibt aus:
10Wenn du sie verwechselst, sagt dir das der Compiler meistens, und oft findet er gleich mehrere Fehler auf einmal. Behebe sie wie üblich ab dem ersten.
So schreibst du es:
Anweisungen
- 1
Das Programm lässt sich nicht kompilieren: Der Compiler findet Fehler in den Zeilen 5, 6 und 9. Behebe mithilfe der Tabelle die Zeichen
&und*, sodass jede Zeile tut, was ihr Kommentar sagt. Das Programm gibt dannPunktestand: 120aus. - 2
Aber die letzte Zeile gibt statt des Punktestands eine Adresse aus, zum Beispiel
Über den Zeiger: 0xfff4. Behebe das, sodass sie den Wert über den Zeiger ausgibt:Über den Zeiger: 120.