Funktionen

Ein C-Programm besteht aus beliebig vielen Funktionen, die innerhalb des Programmes von jeder Stelle aus aufgerufen werden können.


Die wichtigste Funktion ist die Funktion "main()". Diese übernimmt die Aufgabe des Hauptprogramms.

main

Datentyp main() {
 // Anweisungen und andere Funktionen
}

Eine Funktion mit einem bestimmten Datentyp soll mithilfe des Schlüsselworts "return" einen Wert des entsprechenden Typs an die Stelle zurückgeben, welche sie aufruft.

return

int multi(int zahl1, int zahl2) {
 return (zahl1 * zahl2);
}
int main() {
 int erg = multi(3, 4);
 printf("Die Multiplikation ergibt: %i", erg);
}

Eine Funktion, die keinen Wert zurückliefert, kann den speziellen Datentyp "void" (void = nichtig, ungültig, leer) haben.

void

int multi(int zahl1, int zahl2) {
    printf("Die Multiplikation ergibt: %i", zahl1 * zahl2);
}
void main(void) {
 int erg = multi(3, 4);
 
}

Funktionen werden dann eingesetzt, wenn bestimmte Anweisungsfolgen an verschiedenen Stellen wiederholt benötigt werden. Es lohnt sich auf die einzelnen Aufgaben von Funktionen zu setzen, um diese dann an beliebiger Stelle aufrufen zu können. Damit lassen sich mehrere Abstraktionsebenen in einem Programm einführen. Verschiedene Funktionen werden nur einmal implementiert, können aber zu komplexen Bausteinen zusammengesetzt werden.


Eine Funktion kann nicht nur Werte zurückliefern, sondern auch eine beliebige Anzahl an Werten entgegennehmen. In runden Klammern werden diese Werte als Argumente an die Funktion übergeben. Innerhalb der Funktion werden die Argumente als Parameter erwartet und entsprechend verarbeitet, dort können die Parameter wie Variablen behandelt werden.


Die Syntax von Funktionen

Syntax von Funktionen

[Spezifizierer] Rückgabetyp Funktionsname (Parameter) { Anweisungsblock }

Spezifizierer

Funktion können wie Variablen mit Speicherklassen belegt werden. Weil Funktion nur global definiert werden können, sind die benutzbaren Speicherklassen etwas eingeschränkt.

extern

Bedeutet dass die Funktion auch in einer anderen Quelldatei liegen kann (Voreingestellt / Standardwert).

static

Funktion kann nur innerhalb der Datei verwendet werden, in der sie definiert wurde.

volatile

Verhindert dass der Compiler den Quellcode optimiert.


Rückgabetyp

Bestimmt den Datentyp des Rückgabewertes. Funktionen ohne Rückgabewert sind dann vom Typ "void". Wenn kein Typ angegeben wird, ist er automatisch "int".

Funktionsname

Der eindeutige Name, mit dem die Funktion aufgerufen wird. Namenskonversationen gelten für Funktionen, genau wie bei den Variablen.

Parameter

Eine optionale Angabe, die bestimmt, dass Datentyp und Name spezifiziert werden. Wenn keine Parameter erwartet werden, wird hier häufig "void" angegeben. Mehrere Werte werden mit dem Komma voneinander getrennt.

Anweisungsblock

Wird auch als Funktionsblock bezeichnet.


Die Funktion

Funktion

int berechnen(int a, int b) {
 return (a + b);
}
int main () {
 int summe = berechnen (2, 6);
 printf("Die Summe von 2 und 6 ist %i", summe);
 return 0;
}

Obwohl die Funktionsdeklaration und die Funktionsdefinition genau wie bei den Variablen getrennt erstellt werden kann, bietet es sich doch an, beides in einem Schritt zu erledigen. Die Funktion "berechnen" wird mit dem Datentyp "integer" definiert und erhält die beiden Argumente "int a" und "int b". Die Funktion "berechnen" übernimmt die beiden Parametervariablen ("int a" und "int b") behandelt diese innerhalb der Funktion wie Variablen und liefert das Additionsergebnis der beiden Summanden an die Stelle zurück, von wo sie aufgerufen wurde.

In der Funktion "main()" wird die Funktion berechnen mit den beiden Argumenten "2" und "6" für "int a" und "int b" aufgerufen. Nachdem die Funktion "berechnen" das Ergebnis zurückgeliefert hat, kann der Text mit der Berechnung ausgegeben werden.


Das Aufrufen einer Funktion ist ein Ausdruck und keine Anweisung. Die Argumente bestehen wie die Parameter aus mehreren Werten, die an die Funktion übergeben werden. Sollten mehrere Argumente an die Funktion übergeben werden, so werden diese mit einem Komma voneinander getrennt. Die Anzahl der Argumente und der Datentyp müssen in der Regel mit der Festlegung bei der Deklaration übereinstimmen. Es gibt in C auch Funktionen, die mit einer variablen Anzahl an Argumenten auskommen.

Funktionen können auch ohne Argumente ausgeführt werden.

Funktion ohne Argumente und Rückgabewert

void ausgabe(void) {
 printf("Hallo");
} 
int main() {
    ausgabe();
}

Die Funktion "ausgabe" wird ausgeführt, ohne ihr Argumente zu übergeben. Auch eine Rückgabe wird hier nicht erwartet. Es erscheint einfach nur die Meldung "Hallo".


Üblicherweise wird eine Funktion bis zum Ende des Funktionsblocks (schließende geschweifte klammer) ausgeführt. In der Praxis findet man häufig das Schlüsselwort "return" am Ende des Codeblocks. Wenn kein Ergebnis von der Funktion zurückgeliefert werden soll, ist das Angeben von "return" nicht erforderlich, unterstützt aber die Lesbarkeit des Codes und gehört zum guten Stil der Programmierung. Das Schlüsselwort "return" muss nicht am Ende des Codeblocks stehen, sondern kann beliebig im Funktionsblock geschrieben werden. Wird das Schlüsselwort erreicht, wird die Funktion sofort verlassen. Beim Beenden der Funktion werden alle in der Funktion angelegten lokalen Variablen und Argumente gelöscht. Wenn diese weiterhin benötigt werden, könnend diese Variablen als globale Variablen gespeichert werden. Das könnte aber Nachteile bei der Wiederverwendbarkeit der Funktion mit sich bringen und unter Umständen unnötig viel Speicherplatz reservieren. Eine bessere Variante ist das Arbeiten mit Rückgabewerten.


Weiter mit Zeiger