13.5 Übergabe von Arrays an Funktionen
 
Um Arrays an Funktionen zu übergeben, geht man ähnlich vor wie bei Variablen. Die Funktionsdeklaration sieht folgendermaßen aus:
void function(int feld[], int n_Anzahl)
Auffällig ist hier, dass der Indexwert für die Größe des Arrays nicht angegeben wird. Das liegt daran, dass der Funktion nicht bekannt ist, wie viele Elemente das Array besitzt. Daher ist es empfehlenswert, der Funktion die Anzahl der Elemente als Argument mitzugeben, wie auch im Beispiel oben bei der Deklaration der Variablen n_Anzahl zu sehen ist.
Hierbei kommen Sie zum ersten Mal mit Zeigern in Berührung. Arrays werden bei einer Funktion nicht wie Variablen (call-by-value) kopiert, sondern als Zeiger übergeben (call-by-reference, siehe Kapitel 14, Zeiger). Somit muss die Funktion nicht notwendigerweise eine Kopie für das übergebene Array anlegen (wie sonst üblich), sondern arbeitet lediglich mit der (Anfangs-)Adresse des Arrays. Es ist also nicht zwingend erforderlich, die Größe des Arrays als Parameter an eine Funktion zu übergeben, da auf diese Weise von der Anfangsadresse eines Arrays aus sequenziell alle Elemente des Arrays erreicht werden können. Dieser enge Zusammenhang zwischen Arrays und Pointern wird in Kapitel 14 ausführlich erklärt.
Aufgerufen wird die Funktion mit folgenden Argumenten:
#define MAX 100
...
function(feld, MAX);
Damit bekommt die Funktion function() die Anfangsadresse des Arrays feld übergeben. Es wäre auch folgender Funktionsaufruf möglich:
function(&feld[0], MAX);
Auch hier wird der Funktion die Anfangsadresse, also die Adresse des ersten Elements des Arrays, übergeben. Hier das Beispiel dazu:
/* array10.c */
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
void function(int feld[], int n_anzahl) {
int i;
for(i = 0; i < n_anzahl; i++)
printf("%d; ", feld[i]);
printf("\n");
}
int main(void) {
int val[MAX];
int i;
for(i = 0; i < MAX; i++)
val[i] = i+1;
function(val, MAX);
return EXIT_SUCCESS;
}
So weit, so gut. Wenn Sie jetzt aber bereits ein wenig Erfahrung mit C haben bzw. Ihnen das Thema Zeiger nicht ganz fremd erscheint, werden Sie sich wohl fragen, warum hier die Array-Deklaration so einfach mit einer Zeiger-Deklaration als formalem Parameter austauschbar ist? Dies hat den einfachen Grund, dass Arrays sofort in Zeiger umgewandelt (zerfallen) werden und somit nie wirklich ein Array an eine Funktion übergeben wird. Besonders Anfänger verwirrt dieser Umstand recht häufig, aber diese Umwandlung gilt wirklich NUR für die formalen Parameter einer Funktion!
Jetzt ist Ihnen zwar bekannt, dass ein Array an eine Funktion als Referenz (auf eine Adresse) übergeben wird. Wie aber ist vorzugehen, wenn ein Array unbedingt als Kopie übergeben werden soll? Sie können das Array in eine Struktur verpacken und dann an die Funktion übergeben. Näheres zu den Strukturen erfahren Sie weiter unten. Für den Fall der Fälle, hier das Beispiel dazu:
/* array11.c */
#include <stdio.h>
#include <stdlib.h>
struct array{ int wert[3]; };
void output_array(struct array z) {
int i;
for(i = 0; i < sizeof(struct array) / sizeof(int); i++)
printf("%d\t", z.wert[i]);
printf("\n");
}
int main(void) {
struct array new_array;
new_array.wert[0] = 10;
new_array.wert[1] = 20;
new_array.wert[2] = 30;
/* call-by-value */
output_array(new_array);
return EXIT_SUCCESS;
}
|