Strukturen und Funktionen in C

Hallo da draußen, zukünftige Codewizardinnen und - wizards! Heute machen wir uns auf eine aufregende Reise in die Welt der Strukturen und Funktionen in C. Als dein freundlicher Nachbarschaftsinformatiklehrer bin ich hier, um dich durch dieses Abenteuer mit vielen Beispielen und Erklärungen zu führen. Also, schnallt eure virtuellen Rucksäcke an und taucht ein!

C - Structures and Functions

Was sind Strukturen?

Bevor wir anfangen, Strukturen wie heiße Kartoffeln herumzureichen, lassen wir uns erst mal klar machen, was sie sind. In C ist eine Struktur wie ein Behälter, der verschiedene Arten von Daten aufnehmen kann. Stell dir vor, du packst für eine Reise - du könntest einen Koffer (die Struktur) haben, der deine Kleidung, Hygieneartikel und vielleicht ein gutes Buch (verschiedene Datentypen) enthält.

So definieren wir eine einfache Struktur:

struct Student {
char name[50];
int age;
float gpa;
};

Diese Student-Struktur kann einen Namen (als String), ein Alter (als Integer) und einen GPA (als Float) aufnehmen. quite lässig, oder?

Wie man Strukturelemente übergeben

Nun schauen wir uns an, wie wir einzelne Elemente einer Struktur an eine Funktion übergeben können. Es ist, als ob du deinen Freund bittest, nur deine Zahnbürste aus deinem Koffer zu holen, nicht das ganze Ding.

#include <stdio.h>

struct Student {
char name[50];
int age;
float gpa;
};

void printAge(int age) {
printf("Das Alter des Schülers ist: %d\n", age);
}

int main() {
struct Student john = {"John Doe", 20, 3.8};
printAge(john.age);
return 0;
}

In diesem Beispiel geben wir nur das age-Element unserer Student-Struktur an die printAge-Funktion weiter. Es ist einfach und unkompliziert!

Wie man eine Strukturvariable übergeben

Was aber, wenn wir die ganze "Koffer" übergeben möchten? Das können wir auch! Hier ist, wie wir eine ganze Struktur an eine Funktion übergeben:

#include <stdio.h>

struct Student {
char name[50];
int age;
float gpa;
};

void printStudent(struct Student s) {
printf("Name: %s\n", s.name);
printf("Alter: %d\n", s.age);
printf("GPA: %.2f\n", s.gpa);
}

int main() {
struct Student john = {"John Doe", 20, 3.8};
printStudent(john);
return 0;
}

Hier übergeben wir die gesamte john-Struktur an die printStudent-Funktion. Es ist, als ob du deinen whole Koffer an deinen Freund übergibst.

Wie man eine Struktur aus einer Funktion zurückgibt

Nun werden wir fancy. Was ist, wenn wir möchten, dass eine Funktion eine ganze Struktur erstellt und zurückgibt? Es ist, als ob du deinen Freund bittest, einen Koffer für dich zu packen und ihn zurückzubringen. Hier ist, wie wir das machen:

#include <stdio.h>
#include <string.h>

struct Student {
char name[50];
int age;
float gpa;
};

struct Student createStudent(char *name, int age, float gpa) {
struct Student s;
strcpy(s.name, name);
s.age = age;
s.gpa = gpa;
return s;
}

int main() {
struct Student newStudent = createStudent("Jane Doe", 22, 3.9);
printf("Neuer Schüler erstellt: %s, %d Jahre alt, GPA: %.2f\n",
newStudent.name, newStudent.age, newStudent.gpa);
return 0;
}

In diesem Beispiel ist unsere createStudent-Funktion wie eine Schüler-erstellende Maschine. Du gibst ihr die Details, und sie gibt dir einen fully gepackten "Schülerkoffer" zurück!

Wie man eine Struktur per Referenz übergeben

Manchmal möchten wir die ursprüngliche Struktur innerhalb einer Funktion ändern. Es ist, als ob du deinen Freund bittest, etwas in deinen Koffer hinzuzufügen, ohne das ganze Ding zurückzubringen. Dafür verwenden wir Zeiger:

#include <stdio.h>

struct Student {
char name[50];
int age;
float gpa;
};

void updateAge(struct Student *s, int newAge) {
s->age = newAge;
}

int main() {
struct Student john = {"John Doe", 20, 3.8};
printf("Johns Alter vor: %d\n", john.age);
updateAge(&john, 21);
printf("Johns Alter nach: %d\n", john.age);
return 0;
}

Hier übergeben wir die Adresse unserer john-Struktur an die updateAge-Funktion. Die Funktion verwendet dann den ->-Operator, um direkt auf das age-Feld zuzugreifen und es zu ändern.

Wie man einen Zeiger auf eine Struktur zurückgibt

Zuletzt schauen wir uns an, wie wir einen Zeiger auf eine Struktur zurückgeben können. Dies ist nützlich, wenn wir mit großen Strukturen zu tun haben oder wenn wir Strukturen erstellen möchten, die nach dem Ende der Funktion bestehen bleiben.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Student {
char name[50];
int age;
float gpa;
};

struct Student* createStudentPointer(char *name, int age, float gpa) {
struct Student *s = malloc(sizeof(struct Student));
strcpy(s->name, name);
s->age = age;
s->gpa = gpa;
return s;
}

int main() {
struct Student *newStudent = createStudentPointer("Bob Smith", 19, 3.7);
printf("Neuer Schüler erstellt: %s, %d Jahre alt, GPA: %.2f\n",
newStudent->name, newStudent->age, newStudent->gpa);
free(newStudent);  // Vergiss nicht, den zugewiesenen Speicher freizugeben!
return 0;
}

In diesem Beispiel ist unsere createStudentPointer-Funktion wie ein Valet-Service. Sie packt nicht nur deinen Koffer für dich, sondern erinnert sich auch, wo sie ihn hingelegt hat und gibt dir die Lage (den Zeiger).

Schlussfolgerung

Und da habt ihr es, Leute! Wir haben Strukturen auf verschiedene Weisen gepackt, entpackt, geändert und erstellt. Denkt daran, Übung macht den Meister, also fürchtet euch nicht, mit diesen Konzepten zu experimentieren. Wer weiß? Vielleicht strukturiert ihr euch den Weg zum nächsten großen Ding in der Programmierung!

Hier ist eine schnelle Referenztabelle der Methoden, die wir behandelt haben:

Methode Beschreibung
Passing Struct Elements Individuelle Felder einer Struktur an eine Funktion übergeben
Passing Struct Variable Eine ganze Struktur an eine Funktion übergeben
Returning Struct Eine Struktur aus einer Funktion erstellen und zurückgeben
Passing Struct by Reference Eine Struktur innerhalb einer Funktion mit Zeigern ändern
Returning Struct Pointer Eine Struktur im Heap erstellen und deren Zeiger zurückgeben

Happy Coding und mögen eure Strukturen immer gut organisiert sein!

Credits: Image by storyset