Wir sind bereits in Kapitel 10.2 mit Arrays in Berührung gekommen. Die dort behandelten Beispiele waren eindimensionale Arrays, auch Vektoren genannt. Deren Elemente werden durch einen Index adressiert. Es gibt in C auch mehrdimensionale Arrays, deren Elemente mit zwei oder mehr Indizes adressiert werden; dementsprechend spricht man von zwei-, drei- oder mehrdimensionalen Arrays.
Ein zweidimensionaler Array mit zwei Zeilen und vier Spalten könnte z.B. so deklariert werden:
Möchte man ihn bei der Deklaration bereits initialisieren, dann geht das wie folgt:
Das veranschaulicht die zweidimensionale Struktur. Die Initialisierung ist aber auch folgendermaßen möglich:
Werden nicht für alle Elemente Werte bei der Initialisierung angegeben, dann werden die übrigen Elemente automatisch mit 0 initialisiert. Fehlt die Initialisierung, dann sind die Elemente mit zufälligen Werten belegt, es sei denn, es handelt sich bei dem Array um eine globale oder um eine static-Variable: dann werden alle Elemente mit 0 initialisiert.
Wie man oben sieht, ist die Anzahl der Elemente eines mehrdimensionalen Arrays gleich dem Produkt der Dimensionen, in obigem Beispiel also 2 * 4 = 8 Elemente. Man beachte, dass mehrdimensionale Arrays schnell sehr groß werden können. So hat der vierdimensionale Array int vierdim[14][14][14][14] bereits 14*14*14*14 = 38.416 Elemente und belegt auf einem 8-Bit-System (int = 2 Bytes) 76.832 Bytes. Das sprengt bereits das 64k-Limit.
Als praktisches Beispiel wollen wir eine Quartalsabrechnung erstellen, ähnlich wie in einer Tabellenkalkulation:
Code: Alles auswählen
Artikel1 Artikel2 Artikel3 Gesamt
Q1 15 98 35 148
Q2 23 47 52 122
Q3 48 32 14 94
Q4 47 56 76 179
Gesamt 133 233 177 543
Dazu verwenden wir einen zweidimensionalen Array:
Code: Alles auswählen
int matrix[5][4] = {
// Zeile: Artikel 1, Artikel 2, Artikel 3, Gesamt
{15, 98, 35, 0}, // Q1
{23, 47, 52, 0}, // Q2
{48, 32, 14, 0}, // Q3
{47, 56, 76, 0}, // Q4
{ 0, 0, 0, 0} // Gesamt
};
Die Zeilen- und Spaltensummen sind mit 0 initialisiert; wir werden die Werte im Programm berechnen.
Code: Alles auswählen
#include <stdio.h>
int main(void)
{
int matrix[5][4] = {
// Zeile: Artikel 1, Artikel 2, Artikel 3, Gesamt
{15, 98, 35, 0}, // Q1
{23, 47, 52, 0}, // Q2
{48, 32, 14, 0}, // Q3
{47, 56, 76, 0}, // Q4
{ 0, 0, 0, 0} // Gesamt
};
unsigned char zeile, spalte;
int sum;
// Spaltensummen
for (spalte = 0; spalte < 3; spalte++) {
sum = 0;
for (zeile = 0; zeile < 4; zeile++) {
sum += matrix[zeile][spalte];
}
matrix[4][spalte] = sum;
}
// Zeilensummen
for (zeile = 0; zeile < 5; zeile++) {
sum = 0;
for (spalte = 0; spalte < 3; spalte++) {
sum += matrix[zeile][spalte];
}
matrix[zeile][3] = sum;
}
// Ausgabe
printf("\tArt1\tArt2\tArt3\tGesamt\n");
for (zeile = 0; zeile < 5; zeile++) {
if (zeile < 4) {
printf("Q%d\t", zeile + 1);
}
else {
printf("Gesamt\t");
}
for (spalte = 0; spalte < 4; spalte++) {
printf("%d\t", matrix[zeile][spalte]);
}
printf("\n");
}
return 0;
}
Hier ist das ganze Programm in der main-Funktion realisiert, was nicht besonders schön ist. Besser wäre es, das Programm in meherere Funktionen aufzuteilen; dabei lernen wir, wie man ein Array an eine Funktion übergibt:
Code: Alles auswählen
#include <stdio.h>
/* Calculates the sum for each column of the matrix. */
void calcColumnSums(int m[5][4]) {
unsigned char zeile, spalte;
int sum;
for (spalte = 0; spalte < 3; spalte++) {
sum = 0;
for (zeile = 0; zeile < 4; zeile++) {
sum += m[zeile][spalte];
}
m[4][spalte] = sum;
}
}
/* Calculates the sum for each row of the matrix. */
void calcRowSums(int m[5][4]) {
unsigned char zeile, spalte;
int sum;
for (zeile = 0; zeile < 5; zeile++) {
sum = 0;
for (spalte = 0; spalte < 3; spalte++) {
sum += m[zeile][spalte];
}
m[zeile][3] = sum;
}
}
/* Prints the quarterly statement. */
void printQuarterlyStatement(int m[5][4]) {
unsigned char zeile, spalte;
printf("\tArt1\tArt2\tArt3\tGesamt\n");
for (zeile = 0; zeile < 5; zeile++) {
if (zeile < 4) {
printf("Q%d\t", zeile + 1);
}
else {
printf("Gesamt\t");
}
for (spalte = 0; spalte < 4; spalte++) {
printf("%d\t", m[zeile][spalte]);
}
printf("\n");
}
}
/* The main function. */
int main(void)
{
int matrix[5][4] = {
// Zeile: Artikel 1, Artikel 2, Artikel 3, Gesamt
{15, 98, 35, 0}, // Q1
{23, 47, 52, 0}, // Q2
{48, 32, 14, 0}, // Q3
{47, 56, 76, 0}, // Q4
{ 0, 0, 0, 0} // Gesamt
};
calcColumnSums(matrix);
calcRowSums(matrix);
printQuarterlyStatement(matrix);
return 0;
}
Normalerweise verwenden alle Funktionsaufrufe call-by-value bei der Parameterübergabe. Die Ausnahme sind Arrays: hier wird nicht etwa eine Kopie des gesamten Arrays an die Funktion übergeben, sondern lediglich die Adresse des ersten Elements des Arrays. So kann eine Funktion wie calcColumnSums() die Inhalte der Variablen matrix in main() verändern ohne dabei besonders mit Pointern arbeiten zu müssen. Wir erinnern uns: Der Name eines Arrays ist ein Zeiger auf das erste Element.