Deklaration ·
Parameter ·
Rückgabewerte ·
Prototypen ·
Rekursion ·
Zeiger
Funktionen sind das Herzstück der C-Programmierung – sie strukturieren Code, fördern Wiederverwendbarkeit und ermöglichen modulare Programmierung.
Funktionen in C bestehen aus einer Deklaration (Prototyp) und einer Definition (Implementierung). Der Rückgabetyp und die Parametertypen müssen angegeben werden.
| Bestandteil | Beschreibung | Beispiel |
|---|---|---|
| Rückgabetyp | Datentyp des Rückgabewerts (void = kein Wert) |
int, float, void, char* |
| Funktionsname | Bezeichner der Funktion | add, printMessage |
| Parameterliste | Typ und Name der Parameter (kann leer sein) | (int a, int b) oder (void) |
| Funktionsrumpf | Code in { } Klammern |
{ return a + b; } |
.h).
Parameter werden in C standardmäßig by Value übergeben – die Funktion arbeitet mit einer Kopie. Für die Änderung von Originalwerten benötigen Sie Zeiger (Call by Reference).
| Typ | Beschreibung | Beispiel |
|---|---|---|
| By Value | Kopie des Werts wird übergeben | void f(int x) |
| By Reference (Zeiger) | Adresse wird übergeben – Änderungen wirken sich aus | void f(int* x) |
| Array als Parameter | Übergabe als Zeiger auf erstes Element | void f(int arr[], int size) |
| const Parameter | Parameter darf nicht geändert werden | void f(const int x) |
Rückgabewerte werden mit return zurückgegeben. Der Rückgabetyp muss in der Funktionsdeklaration angegeben werden. void bedeutet, dass kein Wert zurückgegeben wird.
| Typ | Beschreibung | Beispiel |
|---|---|---|
| void | Kein Rückgabewert | void print() { ... } |
| int, float, char, ... | Rückgabe eines einzelnen Werts | int add(int a, int b) |
| Zeiger (int*, char*, ...) | Rückgabe einer Adresse (Array, Struct) | int* getData() |
| struct | Rückgabe einer Struktur (per Wert) | struct Point getPoint() |
static für Arrays, die von einer Funktion zurückgegeben werden, damit sie nach dem Funktionsende erhalten bleiben. Oder nutzen Sie malloc für dynamische Speicherzuweisung.
Funktionsprototypen (Vorwärtsdeklarationen) informieren den Compiler über den Rückgabetyp und die Parameter einer Funktion, bevor sie definiert wird. Sie werden oft in Header-Dateien (.h) ausgelagert.
| Regel | Beschreibung |
|---|---|
| Prototyp vor Aufruf | Der Compiler muss den Prototyp kennen, bevor die Funktion aufgerufen wird |
| Header-Dateien (.h) | Prototypen werden in Header-Dateien ausgelagert und mit #include eingebunden |
| Mehrere Dateien | Prototypen ermöglichen die Verwendung von Funktionen aus anderen Quellcodedateien |
| Parameter-Namen | In Prototypen sind Parameternamen optional, der Typ ist jedoch Pflicht |
.h) aus und binden Sie sie mit #include ein. So können Sie Funktionen in mehreren Dateien wiederverwenden.
Rekursion bedeutet, dass eine Funktion sich selbst aufruft. Jede rekursive Funktion benötigt einen Basisfall (Abbruchbedingung) und einen rekursiven Aufruf, der sich dem Basisfall annähert.
| Aspekt | Beschreibung |
|---|---|
| Basisfall | Abbruchbedingung – beendet die Rekursion |
| Rekursiver Schritt | Funktion ruft sich selbst mit veränderten Parametern auf |
| Stack | Jeder Aufruf belegt Speicher auf dem Call-Stack |
| Terminierung | Die Rekursion muss irgendwann terminieren (Basisfall erreichen) |
Fortgeschrittene Konzepte erweitern die Funktionalität von Funktionen – von der Übergabe von Funktionen als Parameter über Performance-Optimierung bis zu variadischen Funktionen.
| Technik | Beschreibung | Beispiel |
|---|---|---|
| Funktionszeiger | Zeiger auf eine Funktion – für Callbacks und dynamische Auswahl | int (*f)(int, int) |
| inline | Compiler-Vorschlag zur Code-Ersetzung (Performance) | inline int add(int a, int b) |
| Variadisch | Variable Anzahl von Parametern (z.B. printf) | int sum(int count, ...) |
| static inline | Inline-Funktion mit interner Bindung | static inline int max(int a, int b) |
int f(int)
int* p
return x
prototype
Rekursion
inline
int add(int a, int b) { return a + b; } ·
void f(int* x) { *x = 10; }