7.4    Funktionsparameter

Nun zeigen wir Ihnen die Verwendung von Parametern im Detail. Parameter wurden ja schon angedeutet – nun wird dieser Begriff mit Leben gefüllt. Funktionen ohne Parameter mit dem Schlüsselwort void kennen Sie bereits. Sie können aber auch Werte an eine Funktion übergeben. Meist stammen die Werte, die Sie übergeben möchten, aus Variablen. Hierbei haben Sie zwei Möglichkeiten: Sie kopieren den aktuellen Wert des Arguments in den formalen Parameter der Funktion, oder Sie kopieren lediglich die Speicheradresse des Arguments in den formalen Parameter der Funktion. In diesem Abschnitt geht es zunächst nur um die Übergabe als Kopie, die auch als Call by Value bezeichnet wird.

Im Folgenden sehen Sie ein einfaches Beispiel, wie Sie Werte an eine Funktion übergeben und damit weiterarbeiten:

00  // Kapitel7/funktionsparameter.c
01 #include <stdio.h>

02 void multi(int ival1, int ival2) {
03 printf("%d * %d = %d\n", ival1, ival2, ival1*ival2);
04 }

05 int main(void) {
06 int val1 = 0, val2 = 0;
07 printf("Bitte zwei positive Ganzzahlen: ");
08 if( scanf("%d %d", &val1, &val2) != 2 ) {
09 printf("Fehler bei der Eingabe...\n");
10 return 1;
11 }
12 multi( val1, val2 );
13 return 0;
14 }

Listing 7.4    Das letzte Beispiel demonstriert die Übergabe von Funktionsparametern.

In der Funktionsdefinition in Zeile (02) wird die formale Parameterliste festgelegt. In diesem Beispiel werden zwei Integer-Werte vereinbart. Nachdem in der main()-Funktion zwei Integer-Werte eingelesen worden sind, wird in Zeile (12) die Funktion mit den entsprechenden Argumenten aufgerufen, also mit den Variablen val1 und val2. Jetzt kann die Funktion in den Zeilen (02) bis (04) mit den übergebenen Parametern arbeiten. In dem letzten Beispiel gibt die Funktion nur einen Text mit dem Ergebnis der Multiplikation der beiden Integer-Werte aus.

Die formale Parameterliste

Besonders wichtig, wenn Sie eine Funktion mit Parametern (auch formale Parameterliste genannt) aufrufen, ist, dass diese Argumente mit dem Typ und der Reihenfolge sämtlicher formalen Parameter übereinstimmen müssen. Sollten Sie beispielsweise versehentlich oder absichtlich einen falschen Datentyp als Argument an die Funktion übergeben, findet eine implizite Typumwandlung (sofern keine explizite Umwandlung erfolgt ist) statt.

Das Programm gibt der Ausführung Folgendes aus:

Bitte zwei positive Ganzzahlen: 10 3
10 * 3 = 30

Beachten Sie, dass beim Call-by-Value-Verfahren immer eine Kopie vom Speicherobjekt des Aufrufers an die Funktion übergeben wird. Eine Veränderung der Werte in der Funktion hat keine Auswirkung auf die Werte des Aufrufers. Des Weiteren benötigt eine Werteübergabe als Kopie mehr Rechenleistung, weil die Werte bei der Übergabe extra in einen anderen Speicherbereich ausgelagert werden müssen. Sie werden im weiteren Verlauf des Buches noch öfter mit diesem Begriff in Berührung kommen, aber an dieser Stelle sei schon einmal erwähnt, dass die Funktionsparameter auf dem Prozessorstapel (dem sogenannten Stack) abgelegt werden. Genau diese Aktion kostet für jede Variable etwas Verwaltungsaufwand und damit Zeit.

Implizite Datentypumwandlung

Wenn Sie nicht den Datentyp als Argument an die Funktion übergeben, der als formaler Parameter vereinbart wurde, findet eine implizite Typumwandlung statt (sofern Sie keine explizite Umwandlung durchführen). Hierbei gelten dieselben Regeln, wie dies schon in Abschnitt 4.6, »Implizite Typumwandlung«, umfangreich beschrieben wurde. Hierzu ein Beispiel:

void circle(int radius) {
// Anweisungen
}

int main(void) {
double dval = 3.33;
circle(dval);
...
}

In diesem Beispiel wird zwar ein Gleitpunktyp an die Funktion circle() als Argument übergeben, aber der formale Parameter von circle() ist ein Integer-Wert. Daher wird eine implizite Umwandlung von float nach int durchgeführt und die Nachkommastelle abgeschnitten.