Zurück zu: C Tutorial
Variablen im Verbund
Strukturen (auch Structs genannt) sind eine Möglichkeit, mehrere verwandte Variablen an einem Ort zu gruppieren. Jede Variable in der Struktur wird als Strukturelement der Struktur bezeichnet.
Im Gegensatz zu einem Array kann eine Struktur viele verschiedene Datentypen enthalten (int, float, char usw.).
Erstelle eine Struktur
Du kannst eine Struktur erstellen, indem Du das Schlüsselwort struct verwendest und jedes Strukturelement in geschweiften Klammern deklarierst:
struct MeineStruktur { // Struktur deklarieren
int nummer; // Strukturelement (int-Variable)
char einZeichen; // Strukturelement (char-Variable)
}; // Ende der Struktur mit dem Komma
Um auf die Struktur zuzugreifen, musst Du eine Variable davon erstellen.
Verwende das Schlüsselwort struct innerhalb der main() Methode, gefolgt vom Namen der Struktur und dann dem Namen der Strukturvariablen:
Erstellen Sie eine Strukturvariable mit dem Namen „s1“:
struct MeineStruktur {
int nummer;
char einZeichen;
};
int main() {
struct MeineStruktur s1;
return 0;
}
Zugriff auf Strukturelemente
Um auf Strukturelemente Deiner Struktur zuzugreifen, verwendest Du die Punktsyntax (.):
Beispiel
struct MeineStruktur {
int nummer;
char einZeichen;
};
int main() {
struct MeineStruktur s1;
// Werte zuweisen
s1.nummer = 13;
s1.einZeichen = 'B';
// Werte ausgeben
printf("Nummer: %d\n", s1.nummer);
printf("einZeichen: %c\n", s1.einZeichen);
return 0;
}
Jetzt kannst Du ganz einfach mehrere Strukturvariablen mit unterschiedlichen Werten erstellen, indem Du nur eine Struktur verwendest:
Beispiel
// mehrere Struktur-Variablen deklarieren
struct MeineStruktur s1;
struct MeineStruktur s2;
// Werte zuweisen
s1.nummer = 13;
s1.einZeichen = 'B';
s2.nummer = 20;
s2.einZeichen = 'C';
Strings in Strukturen?
Bedenke, dass Zeichenfolgen in C eigentlich ein Array von Zeichen sind und dass Du einem Array keinen Wert direkt zuweisen kannst:
Beispiel
struct MeineStruktur {
int nummer;
char einZeichen;
char name[30]; // String
};
int main() {
struct MeineStruktur s1;
// FEHLER: das geht so nicht!!!
s1.name = "Klaus";
// Wert ausgeben - korrekt
printf("Name: %s", s1.name);
return 0;
}
Es tritt ein Fehler auf:
prog.c:12:15: error: assignment to expression with array type
Es gibt jedoch eine Lösung dafür! Du musst die Funktion strcpy() verwenden und den Wert s1.myString wie folgt zuweisen:
Beispiel
struct MeineStruktur {
int nummer;
char einZeichen;
char name[30]; // String
};
int main() {
struct MeineStruktur s1;
// Zuweisung über strcpy()
strcpy(s1.name, "Klaus");
// Wert ausgeben - korrekt
printf("Name: %s", s1.name);
return 0;
}
Ergebnis:
My string: Some text
Einfachere Syntax
Du kannst den Strukturelementen auch zum Zeitpunkt der Deklaration in einer einzigen Zeile Werte zuweisen.
Füge die Werte einfach in eine durch Kommas getrennte Liste in geschweifte Klammern {} ein. Beachte, dass Du bei dieser Technik die Funktion strcpy() für Strings nicht verwenden musst:
Beispiel
struct MeineStruktur {
int nummer;
char einZeichen;
char name[30]; // String
};
int main() {
struct MeineStruktur s1 = {13, 'B', "Klaus"};
// Wert ausgeben - korrekt
printf("Name: %s", s1.name);
return 0;
}
Hinweis: Die Reihenfolge der eingefügten Werte muss mit der Reihenfolge der in der Struktur deklarierten Variablentypen übereinstimmen (13 für int, „B“ für char usw.).
Strukturen kopieren
Du kannst auch eine Struktur einer anderen zuordnen.
Im folgenden Beispiel werden die Werte von s1 nach s2 kopiert:
Beispiel
struct myStructure s1 = {13, 'B', "Some text"};
struct myStructure s2;
s2 = s1;
Werte ändern
Wenn Du einen Wert ändern/modifizieren möchtest, kannst Du die Punktsyntax (.) verwenden. Und um einen String-Wert zu ändern, ist die Funktion strcpy() wieder nützlich:
Beispiel
struct MeineStruktur {
int nummer;
char einZeichen;
char name[30]; // String
};
int main() {
// Struktur erstellen und Werte zuweisen
struct MeineStruktur s1 = {13, 'B', "Klaus"};
// Werte verändern
s1.nummer = 14;
s1.einZeichen = 'F';
strcpy(s1.name, "Hans");
// Wert ausgeben - korrekt
printf("Name: %s", s1.name);
return 0;
}
Das Ändern von Werten ist insbesondere dann sinnvoll, wenn Du Strukturwerte kopierst:
Beispiel
// Struktur erstellen und Werte zuweisen
struct MeineStruktur s1 = {13, 'B', "Klaus"};
// weitere Variable für Struktur erstellen
struct MeineStruktur s2;
// Werte von s1 in s2 kopieren
s2 = s1;
// Werte in s2 ändern
s2.nummer = 30;
s2.einZeichen = 'C';
strcpy(s2.name, "Fritz");
// Werte ausgeben
printf("%d %c %s\n", s1.name, s1.einZeichen, s1.name);
printf("%d %c %s\n", s2.name, s2.einZeichen, s2.name);
Ok, also, wie sind Strukturen nützlich?
Stellen Dir Dir vor, Du musst ein Programm schreiben, um verschiedene Informationen über Autos zu speichern, wie etwa Marke, Modell und Baujahr. Das Tolle an Strukturen ist, dass Du eine einzige „Autovorlage“ erstellst und diese für alle Autos verwenden kannst. Unten findest Du ein Beispiel aus dem echten Leben.
Beispiel aus dem echten Leben
Verwende eine Struktur, um verschiedene Informationen zu Autos zu speichern:
Beispiel
struct Auto {
char marke[50];
char modell[50];
int jahr;
};
int main() {
struct Auto auto1 = {"BMW", "X5", 2001};
struct Auto auto2 = {"Mercedes", "190", 1985};
struct Auto auto3 = {"Opel", "Astra", 2011};
printf("%s %s %d\n", auto1.marke, auto1.modell, auto1.jahr);
printf("%s %s %d\n", auto2.marke, auto2.modell, auto2.jahr);
printf("%s %s %d\n", auto3.marke, auto3.modell, auto3.jahr);
return 0;
}