Exkurs zum Thema Zeiger

22.05.2017 05:31 Uhr

Merke: In einer klassischen Bibliothek war ALLE Information auf Papier vorhanden. Um Information zu speichern BRAUCHTE man Papier.

Bücher waren auf Papier gedruckt; Bibliographien waren auf Papier gedruckt;
und Karteikarten mit dem Titel einer Bibliographie auch.

Analog BRAUCHT man sowohl für eine Zeichenkette, als auch für
eine Variable, die auf eine Zeichenkette verweist, Speicher.


Gegeben sei das Programmfragment:

char *var ="Eine Zeichenkette";

Dann brauchen wir nach dem oben Gesagten,

  • Speicher (18 Bytes) um die Zeichenkette „Eine Zeichenkette
    abzuspeichern und
  • Speicher (in real existierenden Rechner meist 4 Bytes) um die Adresse der
    Zeichenkette mit Hilfe der Variable var zu verwalten.

Nehmen wir an, die Zeichenkette „Eine Zeichenkette“ wird vom Compiler
an der (fiktiven) Adresse 10000
abgespeichert. Dann gilt:

Das Byte mit der Adresse enthält das Zeichen Hier beginnt die Zeichenkette
10000
E
Eine Zeichenkette
10001
i
ine Zeichenkette
10002
n
ne Zeichenkette
10003
e
e Zeichenkette
10004
 
 Zeichenkette
10005
Z
Zeichenkette
10006
e
eichenkette
10007
i
ichenkette
10008
c
chenkette
10009
h
henkette
10010
e
enkette
10011
n
nkette
10012
k
kette
10013
e
ette
10014
t
tte
10015
t
te
10016
e
e
10017
\0

Wenn die Variable var an der Adresse 4000 abgespeichert ist, können wir also folgende Aussagen treffen:

  • „An der Speicherstelle, deren Adresse bei „4000“ steht,
    also an der Speicherstelle „10000„,
    steht das Zeichen ‚E‘.Dieses Zeichen sprechen wir an als var[0] oder *var.
  • „An der Speicherstelle, deren Adresse bei „4000“ steht,
    also an der Speicherstelle „10000„,
    beginnt die Zeichenkette „Eine Zeichenkette“.
    Diese Zeichenkette sprechen wir an als var.[Rein theoretisch, könnten wir auch sagen „Die Zeichenkette, die
    an der Adresse des Zeichens beginnt, das in der Variable var
    verwaltet wird“. Das wäre &var[0] oder noch theoretischer
    sogar &(*var) – wahrscheinlich ist selbsterklärend, warum wir
    diese Form sogut wie nie verwenden.
  • „An der Speicherstelle, deren Adresse man erhält, wenn man die bei
    4000“ gespeicherte um „i“ bytes erhöht,
    also an der Speicherstelle „10000 + i„,
    steht das entsprechende Zeichen aus der obigen Tabelle.
    Dieses Zeichen sprechen wir an als var[i] oder *(var+i).
  • „An der Speicherstelle, deren Adresse man erhält, wenn man die bei
    4000“ gespeicherte um „i“ bytes erhöht,
    also an der Speicherstelle „10000 + i„,
    beginnt die entsprechende Zeichenkette aus der obigen Tabelle.Diese Zeichenkette sprechen wir an als var + i.

Dass var eine Variable war, die auf einen Speicherbereich
zeigte, wird dadurch ausgedrückt, das vor dem Namen von var

ein Sternchen stand:

char var;

Diese Variable enthält ein Zeichen.

char *var;

Diese Variable Renthält die Adresse eines Bytes, in dem ein Zeichen steht.


Nehmen wir nun an, wir haben drei Zeichenketten:

„Köln“, an der Speicherstelle 10000,
„Düsseldorf“, an der Speicherstelle 11000,

„Bonn“, an der Speicherstelle 12000.

Um auf diese Zeichenketten zugreifen zu können, brauchten wir also
Speicherplatz für drei Variable, von denen jede eine der drei Adressen
10000, 11000 und
12000 enthält.

Um diese drei Adressen, von denen jede vier Bytes, beansprucht im Rechner zu
verwalten, brauchen wir also zwölf Bytes. Um die Zeichenketten durch
eine Schleife effektiv hintereinander abarbeiten zu können, ist es
sinnvoll, diese drei Variablen als Array zu verwalten.

Wenn dieses Array by Byte „4000“ beginnt, gilt:

Die vier Bytes mit der Anfangsadresse enthalten die Adresse und zeigen auf die Zeichenkette
4000
10000
Köln
4004
11000
Düsseldorf
4008
12000
Bonn

D.h., es gilt weiter:

Das Byte mit der Adresse enthält das Zeichen Hier beginnt die Zeichenkette
10000
K
Köln
10001
ö
öln
10002
l
ln
10003
n
n
10004
\0
11000
D
Düsseldorf
11001
ü
üsseldorf
11002
s
sseldorf
11003
s
seldorf
11004
e
eldorf
11005
l
ldorf
11006
d
dorf
11007
o
orf
11008
r
rf
11009
f
f
11010
\0
12000
B
Bonn
12001
o
onn
12002
n
nn
12003
n
n
12004
\0

Natürlich muss auch die Anfangsadresse des Arrays selbst gespeichert werden
(auch die Katalogkarte für die Bibliographie musste auf Papier gedruckt
werden), z.B. als Variable array bei Byte „20000„.

Wir können jetzt (u.a.) folgende Aussagen treffen:

  • „An der Speicherstelle, deren Adresse bei „20000“ steht,
    also an der Speicherstelle „4000„, steht die
    Adresse „10000„. Dort steht das Zeichen ‚K‘.
    Dieses Zeichen sprechen wir an als array[0][0] oder **array.
  • „An der Speicherstelle, deren Adresse bei „20000
    steht,
    also an der Speicherstelle „4000„, steht die
    Adresse „10000„. Dort beginnt
    die Zeichenkette „Köln“.Diese Zeichenkette sprechen wir an als array[0] oder *array.
  • „An der Speicherstelle, deren Adresse man erhällt, wenn man die bei
    20000“ gespeicherte, also
    4000„, um „i * (Länge eines
    Zeigers)“ bytes erhöht,
    also an der Speicherstelle auf die „4000 + (i*4)“ zeigt,
    also „10000“ für i=0, „11000“ für i=1 und „12000“ für i=2, steht jeweils
    das erste Zeichen der drei Zeichenketten „Köln“, „Düsseldorf“ und „Bonn“.
    Dieses Zeichen sprechen wir an als array[i][0] oder **(array+i).
  • „An der Speicherstelle, deren Adresse man erhällt, wenn man die bei
    20000“ gespeicherte, also
    4000„, um „i * (Länge eines
    Zeigers)“ bytes erhöht,
    also an der Speicherstelle auf die „4000 + (i*4)“ zeigt,
    also „10000“ für i=0, „11000“ für i=1 und „12000“ für i=2, beginnt jeweils
    eine der drei Zeichenketten „Köln“, „Düsseldorf“ und „Bonn“.
    Diese Zeichenkette sprechen wir an als array[i] oder *(array+i).
  • „An der Speicherstelle, deren Adresse man erhällt, wenn man die bei
    20000“ gespeicherte, also
    4000„, um „i * (Länge eines
    Zeigers)“ bytes erhöht,
    also an der Speicherstelle auf die „4000 + (i*4)“ zeigt,
    also „10000“ für i=0, „11000“ für i=1 und „12000“ für i=2, plus j steht jeweils
    das j-te Zeichen der drei Zeichenketten „Köln“, „Düsseldorf“ und „Bonn“.
    Dieses Zeichen sprechen wir an als array[i][j] oder *(*(array+i)+j).

Dass array eine Variable war, die auf einen Speicherbereich
zeigte, der auf Speicherbereiche zeigte, die Zeichenketten enthielten, wird
dadurch ausgedrückt, das vor dem Namen von array
zwei Sternchen standen:

char var;
Diese Variable enthält ein Zeichen.

char *var;

Diese Variable enthält die Adresse eines Bytes, in dem ein Zeichen steht.

char **array

Diese Variable enthält die Adresse eines Bytes, an dem eine Adresse
beginnt, an der ein Zeichen steht.