Funktionen IV


oder Funktionen mit call-by-reference Parametern

Sinn und Zweck

So nun sind wir beim letzten Kapitel dieses Online C-Kurses. Hier sollte es jetzt eigentlich einfach werden, wenn man die beiden letzten beiden Kapitel verstanden hat.
Call-by-reference Parameter sind Parameter, bei denen eine Speicheradresse übergeben wird.
Das kann manchmal sinnvoll sein, wenn eine Funktion mehrere Werte zurückgeben soll, dann geht das ja nicht mit dem Rückgabewert, weil dieser nur einen Wert zurückgeben kann. Eine weitere Anwendung ist, wenn ein Array an eine Funktion übergeben werden soll.

Code-Beispiel

    void fnTest ( int* piValue ) {      //<-- hier ist ein Param. eine Adresse
       *piValue = 17;
    }

    int main(){
       int iVar;
       fnTest( &iVar );                           //<-- Achtung: Speicheradresse!
       printf("iVar hat nach dem Funktionsaufruf den Wert %d", iVar);
    }

Speicheradressen kennen keine Beschränkung, wie in Scope, erklärt. Der Scope einer Variable gilt nur für den Variablennamen, nicht für die Speicheradresse.
Daher innerhalb der Funktion fnTest die Variable iVar geändert werden, da in fnTest nur mit Hilfe des Dereferenzierungsoperators auf die Variable zugegriffen wird.

Übergabe von Array an Funktionen

Diese Möglichkeit eine Speicheradresse zu übergeben kann man sich zu nutze machen, um ein Array an eine Funktion zu übergeben.
Man muss dabei folgendes wissen, wenn man ein Array deklariert hat:

    int aiTest[20];

Dann liefert die folgende Ausgabe die Startadresse:

    printf("Die Startadresse lautet %x", aiTest);

Das bedeutet, dass in dem Namen des Arrays immer die Startadresse des gesamten reservierten Speicherbereichs steht. Damit kann man dann das Array an eine Funkion übergeben

    void fnArrayParamTest ( int* piTest){
       //Schreibe in das 5. und 7. Feld was
       piTest[4] = 17;
       piTest[6] = 23;
    }

    int main(){
       int aiTest[20];
       fnArrayParamTest ( aiTest );   //<-- hier wird nur die Startadresse
                                                                   //         des Arrays übergeben
    }

Hier kann man schön erkennen, dass wieder eine Speicheradresse notwendig ist, um das Array an die Funktion zu übergeben. Es ist auch die einzige Möglichkeit.
Hinweis:  Hier braucht bei aiTest kein Adressoperator verwendet werden, weil aiTest ein Array ist und keine Variable!

Zusammenfassung

Eigentlich gibts nicht viel zusammenzufassen. Ein call-by-reference Parameter ist nichts anderes als ein Pointer-Parameter. Dementsprechend ist nur beim function call darauf zu achten, dass man den richtigen Datentyp / Adresse übergibt.

Infoblätter und Arbeitsblätter

Zusammenhang zwischen Pointern und Parametern
Info: Hier wird nochmal erklärt was ein call-by-reference Parameter ist und es werden auch typische Fehler beim Programmieren erläutert.