C → Arrays

Unter einem »Array« versteht man die Zusammenfassung von mehreren Variablen des gleichen Typs und des selben Namens.

Eindimensionale Arrays

Die allgemeine Syntax zur Definition eines eindimensionalen Arrays ist: Datentyp Arrayname [GROESSE];

Beispiele:

Array Deklaration

int alpha [4]; /* Array aus 4 Elementen vom Typ Integer */
char beta [9]; /* Array aus neuen Elementen vom Typ Character */

Die Anzahl der Elemente »[GROESSE]« muss immer eine positive, ganze Zahl sein. Das kann eine Konstate (Zahl) sein, nicht aber eine Variable. Die Größe eines Arrays kann nicht dynamisch zugeordnet werden, sie kann jedoch während der Laufzeit mit Hilfe der Funktionen »malloc()« und »calloc()« errechnet und konstruiert werden.

Angesprochen wird das gesamte Array über den Arraynamen und dem Indexwert der in [GROESSE] definierten Anzahl der Elemente des Arrays. Der Indexwert fängt bei Null an zu zählen (zero based index). Durch die Deklaration eines Arrays wird der benötigte Platz dafür, vorgegeben durch des Datentyp, im Speicher reserviert. Das bedeutet konkret, dass das Array »int alpha [4];« den Platz für vier Integer (int) Variablen belegt, die genaue Größe hängt vom zugrunde liegenden System ab. Bei einem 32 Bit Integer (4 Byte) werden demnach 16 Byte reserviert.

Bei der Initialisierung des Arrays wird dieses durch viele Compiler bereits mit Null gefüllt, solange nicht schon bei der Deklaration das Array initialisiert wird. Wird das Array mit weniger Elementen gefüllt, wie in [GROESSE] vorgegeben, dann wird der verbliebene Platz mit Null gefüllt. Die Angabe der Größe [GROESSE] des Arrays kann bei der Deklaration entfallen, wenn das Array explizit bereits bei der Deklaration initialisiert wird:

Initialisierung eines Arrays

int alpha [] = {0, 1, 2, 3};
int beta [4] = {0, 1, 2}; /* entspricht »int beta [4] = {0, 1, 2, 0};« */

Die Größe [GROESSE] (Anzahl der Elemente) eines Arrays kann man ermitteln, in dem man den Gesamtspeicherplatz eines Arrays durch den Speicherplatzbedarf des zugrunde liegenden Datentyps teilt:

sizeof_array.c

#include <stdio.h>
 
int alpha [] = {0, 1, 2, 3};
 
int main() {
    printf("Das Array alpha belegt im Speicher %d Byte Platz\n", sizeof(alpha));
    printf("Der Datentyp int (Integer) belegt pro Element %d Byte Platz im Speicher\n", sizeof(int));
    printf("Das Array alpha beinhaltet %d Elemente\n", sizeof(alpha) / sizeof(int));
    return 0;
}

$ ./sizeof_array
Das Array alpha belegt im Speicher 16 Byte Platz
Der Datentyp int (Integer) belegt pro Element 4 Byte Platz im Speicher
Das Array alpha beinhaltet 4 Elemente

Eine etwas besondere Rolle im Kontext von Arrays, spielt der Datentyp Character (char). Ein Element dieses Datentyps ist per Definition 1 Byte groß, d.h. es wird für jedes Zeichen nur ein Byte im Speicher belegt. Jedoch wird hier das Array mit dem Zeichen »\0« abgeschlossen, was bedeutet, dass bei der Deklaration eines Zeichenfeld Arrays ein Zeichen mehr deklariert werden muss. Der String »Hello, world!« zB besteht aus 13 Zeichen, beim zählen der Elemente eines Arrays, welches mit dem String »Hello, world!« initialisiert ist, werden demnach 14 Elemente gezählt:

char_arrays_1.c

#include <stdio.h>
 
char alpha[] = "Hello, world!";
 
int main(void) {
 
  printf("Anzahl der Elemente des Strings '%s' ist %d\n", alpha, sizeof(alpha));
  printf("Die Groesse eines Element des Datentyps char ist %d Byte\n", sizeof(char));
  return 0;
}

$ ./char_arrays_1
Anzahl der Elemente des Strings 'Hello, world!' ist 14
Die Groesse eines Element des Datentyps char ist 1 Byte

Ein char-Array kann auf mehrere Weisen initialisiert und auch ausgegeben werden:

int_char_arrays.c

#include <stdio.h>
 
char alpha01[14] = {72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 0};
char alpha02[14] = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\0'};
char alpha03[]   = "Hello, world!";
int i;
 
int main(void) {
    printf("%s\n", alpha01);
    printf("%s\n", alpha02);
    printf("%s\n", alpha03);
 
    for(i=0; i<sizeof(alpha01); i++) {
       printf("%c", alpha01[i]);
    }
    printf("\n");
 
    for(i=0; i<sizeof(alpha02); i++) {
       printf("%c", alpha02[i]);
    }
    printf("\n");
 
    for(i=0; i<sizeof(alpha03); i++) {
       printf("%c", alpha03[i]);
    }
    printf("\n");
 
    return 0;
}

Dieser Coder gibt erst mal immer den gleichen String »Hello, world!« aus, welcher auf unterschiedliche Weise in ein char-Array kopiert wurde.

$ ./int_char_arrays 
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!

Damit man den Inhalt der Arrays »alpha01« und »alpha02« nicht selber ausrechnen und tippen muss, kann man die Ausgabe mit geeigneten Formatierungszeichen so hinbiegen, dass man sie so schon übernehmen kann:

out_char_arrays.c

#include <stdio.h>
 
char alpha[] = "Hello, world!";
int i;
 
int main(void) {
 
  for(i=0; i<sizeof(alpha); i++) {
       printf("%d, ", alpha[i]); /* %d gibt den Inhalt als dezimale Ganzzahl aus */
    }
    printf("\n");
 
    for(i = 0; i < sizeof(alpha) -1; i++) {
       printf("'%c', ", alpha[i]); /* %c gibt den Character, also das Zeichen als solches aus */
    }
 
    printf("\n");
    return 0;
}

$ ./out_char_arrays 
72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 0, 
'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!',

tux/arrays.txt (3649 views) · Zuletzt geändert: 2011/12/11 20:45 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0