Teil 22 „Arrays“

Der C-Kurs
Antworten
Benutzeravatar
bodo
User
Beiträge: 321
Registriert: 14.02.2007, 17:21
Kontaktdaten:

Teil 22 „Arrays“

Beitrag von bodo » 02.01.2011, 14:48

C für BASIC-Programmierer

Arbeiten mit dem z88dk Cross-Compiler

von Jens Sommerfeld und Bodo Wenzel

Teil 22

Das heutige Thema passt ganz gut zum vorherigen Teil, bei Steven Vickers heißt das 22. Kapitel „Arrays“. Denn Arrays und Zeiger sind miteinander verwandt.

Anlegen von Arrays

Wir können in C Arrays aus beliebigen Datentypen anlegen:

Code: Alles auswählen

char zeichen_array[5];
int ganzzahl_array[23];
void (*funktionszeigerarray[81])();
Ja, die letzte Definition wird euch bestimmt ein leichtes Stirnrunzeln aufs Gesicht gezaubert haben... So sieht die Definition eines Arrays aus 81 Zeiger auf Funktionen aus. Leider mag das z88dk diese Definition nicht, daher bleiben wir euch ein Beispielprogramm schuldig.

Weiteres zum Anlegen von Arrays hatten wir bereits in Teil 16, bitte schaut dort noch einmal hinein.

Indizes

Nur als Wiederholung: die Indizes zählen in C ab 0 (Null), nicht ab 1 (Eins)! Dies liegt daran, dass das Indizieren eines Elements eigentlich eine Zeigeroperation ist. Der Ausdruck „array[0]“ wird vom Compiler als „*(array + 0)“ betrachtet, die Schreibweise mit den eckigen Klammern ist syntactic sugar ;-).

Der Name des Arrays ist also vom Typ „Zeiger auf einen Wert von Typ des ersten Elements“.

Mehrdimensionale Arrays

Natürlich sind in C auch mehrdimensionale Arrays möglich. Allerdings wird das vom z88dk nicht unterstützt (Das ist eine Altlast aus der Herkunft des z88dk, namentlich Small-C.), daher gibt es hier kein Beispielprogramm. Stattdessen zeigen wir nur die Schreibweise:

Code: Alles auswählen

int drei_dimensionales_array[10][20][30];
Im Speicher liegen die Elemente dann in folgender Reihenfolge, dies allerdings nur zur Illustration:
[0][0][0]
[0][0][1]
...
[0][0][29]
[0][1][0]
[0][1][1]
...

Wenn ihr mehrdimensionale Arrays verwenden wollt, müsst ihr beim z88dk also ein entsprechend großes eindimensionales Array anlegen und die Indexberechnung selbst ausführen.

Warum C so schnell sein kann

Im Gegensatz zu anderen Programmiersprachen ist compiliertes C häufig sehr schnell. Dies liegt u.a. auch daran, dass die Indizes nicht auf das Einhalten der Grenzen geprüft werden! Ihr könnt das mit folgendem Beispiel selbst ausprobieren:

Code: Alles auswählen

#include <stdio.h>

int main(void) {
    int davor;
    int array[4];
    int danach;
    int index;

    davor = 123;
    for (index = 0; index < sizeof(array) / sizeof(int); index++) {
        array[index] = 11 * index;
    }
    danach = 987;

    for (index = -1; index <= sizeof(array) / sizeof(int); index++) {
        printf("%d: %d\n", index, array[index]);
    }

    return 0;
}
Hausaufgaben
  1. Schreibe ein Programm, das 10 Zahlen einliest. Danach sollen die Zahlen in umgekehrter Reihenfolge ausgegeben werden.
  2. Das Programm aus Aufgabe 1 soll so geändert werden, dass die Zahlen in aufsteigender Reihenfolge ausgegeben werden. Oha, das erfordert das Ausdenken und Implementieren eines Sortieralgorithmus: er muss nicht schön oder schnell sein, er muss nur funktionieren! Was muss verändert werden, damit die Zahlen in absteigender Reihenfolge ausgegeben werden?
  3. Wir wollen wissen, wieviele und welche Vokale in einem einzugebenden Text sind. Das Programm soll also einzelne Zeilen mit gets() einlesen, bis ein Punkt als einzelnes Zeichen eingegeben wird. Die Vokale sollen summierend gezählt werden. Am Ende werden die Anzahlen ausgegeben und das Programm ist fertig.
  4. Für Profis: Schreibe ein Programm, das in einem Array aus Zeigern auf Zeichen ein Menü speichert. Es soll dieses Menü anzeigen: je Zeile eine Zahl und den Text des Menüeintrags. Der Benutzer kann dann eine Zahl eingeben und das Programm gibt den dazugehörigen Text aus. Das Ganze soll wiederholt werden, bis der Benutzer den letzten Eintrag auswählt, der z.B. „Ende“ heißen kann.
B0D0: Real programmers do it in hex.

Antworten