Adressen
Willkommen zur Lektion über Zeiger. Viele finden Zeiger den schwersten Teil von C, deshalb geht diese Lektion langsam voran, mit einem kleinen Schritt pro Übung. Es lohnt sich: Mit Zeigern kann eine Funktion deine Variablen ändern, und sie zeigen, wie Arrays wirklich funktionieren.
Alles beginnt mit dem Speicher. Während ein Programm läuft, werden seine Variablen im Speicher des Computers abgelegt. Du kannst dir den Speicher als lange Reihe nummerierter Kästchen vorstellen, wie die Spinde auf einem Schulflur. Jede Variable bekommt ihr eigenes Kästchen, und die Nummer ihres Kästchens ist die Adresse der Variablen.
Um die Adresse einer Variablen zu bekommen, schreibe ein & vor ihren Namen: &alter bedeutet „die Adresse von alter“. Um eine Adresse auszugeben, verwende %p (p wie pointer, englisch für Zeiger), so wie du eine Ganzzahl mit %d ausgibst:
#include <stdio.h>
int main(void) {
int alter = 15;
int punkte = 80;
printf("alter: %d\n", alter);
printf("Adresse von alter: %p\n", &alter);
printf("Adresse von punkte: %p\n", &punkte);
return 0;
}Das gibt aus:
alter: 15
Adresse von alter: 0xfffc
Adresse von punkte: 0xfff8Adressen werden im Hexadezimalsystem (Basis 16) ausgegeben. Deshalb beginnen sie mit 0x und können zwischen den Ziffern die Buchstaben a bis f enthalten. Du musst sie nicht lesen können. Auf deinem eigenen Computer wären die Adressen viel länger, etwa 0x7ffd5e8c3a4c, und sie könnten sich sogar bei jedem Programmstart ändern. Nur zwei Dinge sind wichtig: Jede Variable hat eine Adresse, und verschiedene Variablen haben verschiedene Adressen.
Die beiden Adressen unterscheiden sich um 4, weil ein int 4 Bytes Speicher belegt (ein Byte ist die kleinste Einheit des Speichers). In diesem Kurs musst du keine Bytes zählen: Das übernimmt der Computer.
Das & vor einer Variablen hat nichts mit dem && aus Bedingungen zu tun. Ein einzelnes & direkt vor einem Namen bedeutet „die Adresse von“.
Achte auf diese Fehler:
- Wenn du das
&vergisst, hält dich der Compiler auf.printf("%p\n", alter);endet mit dem Fehlerformat specifies type 'void *' but the argument has type 'int'.%perwartet eine Adresse (void *ist die Schreibweise in C für „eine Adresse von irgendetwas“), aberalterist einint, die Zahl 15. - Der umgekehrte Fehler:
printf("%d\n", &alter);endet mit dem Fehlerformat specifies type 'int' but the argument has type 'int *'.%derwartet eine Ganzzahl, aber&alterist eine Adresse. Der Typint *bedeutet „die Adresse einesint“. Dem begegnest du in der nächsten Übung.
So schreibst du es:
Anweisungen
- 1
Gib am Ende des Programms (vor
return 0;) die Adresse der Variablenlebenaus: den TextAdresse von leben:und%pmit&leben. Das Programm gibt dann auch eine Zeile wieAdresse von leben: 0xfffcaus (die Zahl kann anders sein). - 2
Gib darunter die Adresse von
goldauf dieselbe Weise aus, mit dem TextAdresse von gold:. Die beiden Adressen sind verschieden: Jede Variable hat ihr eigenes Kästchen.