Prof. Dr. Franz Schweiggert Institut für Angewandte Informationsverarbeitung 3. November 2009
Michael Mattes / Wolfgang Kaifler Blatt 4


Uni-Logo



WiMa-Praktikum I / Programmierpraktikum
im Wintersemester 2009/2010



Abgabetermin: bis 10. November 2009

10 Zeigereien (15 Punkte)

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!

11 Sortieren mit Zeigern (6 Punkte)

Zeigen Sie Ihre erworbenen Kenntnisse, indem Sie den Sortieralgorithmus vom letzten Blatt in eine eigene Funktion auslagern. Diese soll allerdings mit Zeigern arbeiten und unabhängig von der Größe des eingelesenen Arrays sein!

Hinweis: Die empfohlene Signatur der Hilfsfunktion lautet:
void bsort(int* anfang, int laenge);

Viel Erfolg!



Michael Mattes 2009-11-03