Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 13 Arrays
  gp 13.1 Arrays deklarieren
  gp 13.2 Initialisierung und Zugriff auf Arrays
    gp 13.2.1 Gültigkeitsbereich von Arrays
  gp 13.3 Arrays vergleichen
  gp 13.4 Anzahl der Elemente eines Arrays ermitteln
  gp 13.5 Übergabe von Arrays an Funktionen
  gp 13.6 Arrays aus Funktionen zurückgeben
  gp 13.7 Programmbeispiel zu den Arrays
  gp 13.8 Einlesen von Array-Werten
  gp 13.9 Mehrdimensionale Arrays
  gp 13.10 Mehrdimensionale Arrays initialisieren
    gp 13.10.1 Tic Tac Toe
    gp 13.10.2 Dreidimensionale Arrays
  gp 13.11 Übergabe von zwei- bzw. mehrdimensionalen Arrays an Funktionen
  gp 13.12 Arrays in Tabellenkalkulation einlesen (*.CSV–Dateien)
  gp 13.13 Strings/Zeichenketten (char Array)
    gp 13.13.1 Vom String zur Binärzahl
  gp 13.14 Einlesen von Strings
  gp 13.15 Standard-Bibliothek <string.h>
    gp 13.15.1 strcat() – Strings aneinander hängen
    gp 13.15.2 strchr() – ein Zeichen im String suchen
    gp 13.15.3 strcmp() – Strings vergleichen
    gp 13.15.4 strcpy() – einen String kopieren
    gp 13.15.5 strcspn() – einen Teilstring ermitteln
    gp 13.15.6 strlen() – Länge eines Strings ermitteln
    gp 13.15.7 strncat() – String mit n Zeichen aneinander hängen
    gp 13.15.8 strncmp() – n Zeichen von zwei Strings miteinander vergleichen
    gp 13.15.9 strncpy() – String mit n Zeichen kopieren
    gp 13.15.10 strpbrk() – Auftreten bestimmter Zeichen suchen
    gp 13.15.11 strrchr() – das letzte Auftreten eines bestimmten Zeichens im String suchen
    gp 13.15.12 strspn() – erstes Auftreten eines Zeichens, das nicht vorkommt
    gp 13.15.13 strstr() – String nach Auftreten eines Teilstrings durchsuchen
    gp 13.15.14 strtok() – String anhand bestimmter Zeichen zerlegen


Galileo Computing - Zum Seitenanfang

13.5 Übergabe von Arrays an Funktionen  toptop

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;
}
 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de