In dieser Aufgaben sollen Sie sich dem Umgang mit Zeigern veranschaulichen. Versuchen Sie hierbei, die Wirkung folgender vier Operatoren zu verstehen:
Der Größenoperator sizeof
, der Array-Zugriffsoperator []
,
der Adressoperator &
sowie der Zeiger-Dereferenzierungsoperator *
(auch Indirektionsoperator genannt). Auch wenn sie das gleiche Zeichen
benutzen, sollten die letzten beiden Operatoren nicht mit dem
bitweisen Und-Operator oder dem Multiplikationsoperator verwechselt
werden!
Sie sollen in der Lage sein, aus einer Speichertabelle und einigen Variablennamen einfache Ausdrücke im Kopf auszuwerten. Ein Beispiel hierzu finden Sie hier:
Alle Angaben sind dezimal! Variablen: char a = 12; // liegt in Adresse 1 char b; // Adresse 2 char c[5]; // ab Adresse 4 char *d; // liegt in Adresse 9 char *e; // Adresse 10 char *f[3]; // ab Adresse 11 char **g; // Adresse 20 int h; // 4 Bytes gross, ab Adresse 15 Speicherbelegung: Adresse Wert Adresse Wert 0 - 1 12 11 19 2 5 12 7 3 33 13 0 4 200 14 100 5 71 15 30 6 172 16 42 7 73 17 23 8 74 18 13 9 1 19 37 10 5 20 1 Beispielaufgaben mit Loesung: Welchen Wert hat jeder Ausdruck? Ausdruck Loesung Ausdruck Loesung a 12 c 4 d 1 *c 200 *d 12 &c[0] 4 &b 2 c[1] 71 *(&b) 5 *c+2 202 *((&b)+1) 33 *(c-1) 33 *g 12 *(c+2) 172 **g 7 &f[0] 11 &e 10 **(f+1) 73 *f[0] 37 f[2] 0 sizeof(a) 1 *f[2] !!!! sizeof(h) 4 sizeof(c) 5
Hinweis: Zeiger sind auf den meisten heute verwendeten Maschinen mindestens 4 Byte gross, nicht 1. Das oben angegebene Beispiel ist nur eine Vereinfachung!
Hinweis 2: Wenn ein Zeiger den Wert 0 (gleichbedeutend mit
NULL
) hat, darf er nicht dereferenziert werden. Dies würde
zu einer Speicherschutzverletzung (segementation fault /
violation) führen, was den sofortigen Abbruch des Programms zur
Folge hat. Im Fall von Treibern würde dies den aus Windows
bekannten ``Bluescreen'' bedeuten.
Hinweis 3: C warnt Sie in manchen Fällen, falls Sie auf ungewöhnliche Weise mit Zeigern umgehen. In einem echten Programm müssten Sie beispielsweise einen Typecast machen, wenn Sie einen Zeiger einer int-Variable zuweisen wollen. Ignorieren Sie solche Warnungen nicht, ohne zumindest einen zweiten Blick auf die betreffende Stelle im Code zu werfen!
Hinweis:
Die empfohlene Signatur der Hilfsfunktion lautet:
void bsort(int* anfang, int laenge);
Viel Erfolg!