Du bist hier: Startseite > Entwicklung (C/C++) > C++ Grundlagen > Datenstrukturen mit struct & union

Datenstrukturen mit struct & union

Die struct Variante

Du hast bis jetzt verschiedene Datentypen (int, float, string usw.) kennen gelernt. Mit struct kann eine neue Struktur erstellt werden, in der mehrere Variablen enthalten sind mit verschiedenen Datentypen. Hier mal ein Beispiel:

Datei:  Quelldateien/main.cpp
  1. #include <iostream> // std::cout, std::endl, std::cin
  2. #include <string> // std::string
  3. #include <stdlib.h> // EXIT_SUCCESS
  4.  
  5. struct Person
  6. {
  7. std::string vorname;
  8. std::string nachname;
  9. int alter;
  10. };
  11.  
  12. int main(void)
  13. {
  14. Person pers;
  15. pers.vorname = "Johannes";
  16. pers.nachname = "Kraemer";
  17. pers.alter = 30;
  18. std::cout << pers.vorname << " " << pers.nachname << " ist " << pers.alter << " Jahre alt!" << std::endl;
  19.  
  20. std::cin.get();
  21. return EXIT_SUCCESS;
  22. }

Es besteht die Möglichkeit, Strukturen zu verschachteln und eine Strukturvariable als Bestandteil einer anderen Struktur zu definieren.

Datei:  Quelldateien/main.cpp
  1. #include <iostream> // std::cout, std::endl, std::cin
  2. #include <stdlib.h> // EXIT_SUCCESS
  3. #include <string> // std::string
  4.  
  5. struct Person
  6. {
  7. std::string vorname;
  8. std::string nachname;
  9. int alter;
  10. };
  11.  
  12. struct Gruppe
  13. {
  14. std::string ort = "Hillesheim";
  15. Person pers1;
  16. Person pers2;
  17. };
  18.  
  19. int main(void)
  20. {
  21. Gruppe gruppe;
  22. gruppe.pers1.vorname = "Johannes";
  23. gruppe.pers1.nachname = "Kraemer";
  24. gruppe.pers1.alter = 30;
  25. gruppe.pers2.vorname = "Karla";
  26. gruppe.pers2.nachname = "Alter";
  27. gruppe.pers2.alter = 58;
  28. std::cout << "P1: " << gruppe.pers1.vorname << " " << gruppe.pers1.nachname << " ist " << gruppe.pers1.alter << std::endl;
  29. std::cout << "P2: " << gruppe.pers2.vorname << " " << gruppe.pers2.nachname << " ist " << gruppe.pers2.alter << std::endl;
  30. std::cout << "Alle wohnen in " << gruppe.ort << std::endl;
  31.  
  32. std::cin.get();
  33. return EXIT_SUCCESS;
  34. }

Eine Struktur kann auch direkt in ein Array geladen werden.

Datei:  Quelldateien/main.cpp
  1. #include <iostream> // std::cout, std::endl, std::cin
  2. #include <stdlib.h> // EXIT_SUCCESS
  3. #include <string> // std::string, std::to_string
  4.  
  5. struct
  6. {
  7. int id;
  8. std::string name;
  9. } alleSpieler[8]; // Array mit Index 8 (erreichbar von 0 bis 7!)
  10.  
  11. int main(void)
  12. {
  13. for (int i = 0; i<8; i++)
  14. {
  15. alleSpieler[i].id = i;
  16. alleSpieler[i].name = "Spieler";
  17. std::cout << "Spieler " << alleSpieler[i].id << " heisst "
  18. << alleSpieler[i].name << std::to_string(alleSpieler[i].id+1) << std::endl;
  19. }
  20.  
  21. std::cin.get();
  22. return EXIT_SUCCESS;
  23. }

Eine Struktur kann auch beim instanzieren direkt definiert werden!

Datei:  Quelldateien/main.cpp
  1. #include <iostream> // std::cout, std::endl, std::cin
  2. #include <stdlib.h> // EXIT_SUCCESS
  3. #include <string> // std::string
  4.  
  5. struct Person
  6. {
  7. int id;
  8. std::string name;
  9. };
  10.  
  11. int main(void)
  12. {
  13. Person pers1 = {1, "Johnny"}; // Direkte definition beim instanzieren
  14. std::cout << "P1 heisst " << pers1.name << std::endl;
  15.  
  16. std::cin.get();
  17. return EXIT_SUCCESS;
  18. }

Strukturen können auch mit pointern verwendet werden. Man erkennt es daran, dass nicht ein Punkt sondern ein strich Pfeil verwendet wird. Hier ein Beispiel:

Datei:  Quelldateien/main.cpp
  1. #include <iostream> // std::cout, std::endl, std::cin
  2. #include <stdlib.h> // EXIT_SUCCESS
  3. #include <string> // std::string
  4.  
  5. struct Person
  6. {
  7. std::string name;
  8. };
  9.  
  10. int main(void)
  11. {
  12. Person pers1; // Struktur deklarieren
  13. Person *pPers1; // Pointer deklarieren
  14. pPers1 = &pers1; // Dem Pointer die Adresse zuweisen
  15. pPers1->name = "Johnny"; // Struktur über pointer ändern
  16. std::cout << "P1 heisst " << pPers1->name << std::endl;
  17.  
  18. std::cin.get();
  19. return EXIT_SUCCESS;
  20. }

Datenstruktur mit union

Eine Union ermöglicht es, Variablen zu definieren, die sich denselben Speicherbereich teilen. Eine Union setzt sich aus verschiedenen Komponenten zusammen, wobei die Komponenten meist einen unterschiedlichen Datentyp besitzen. Der Speicherplatzbedarf einer Union wird bestimmt durch den Speicherplatzbedarf seiner "größten" Variable. Die Variablen (Members) einer Union teilen sich den Speicherbereich. ACHTUNG: Wenn eine Variable einen neuen Wert zugewiesen bekommt, bekommen alle anderen Variablen die vorher definiert wurden irgendeinen Speicherbereich zugewiesen!

Datei:  Quelldateien/main.cpp
  1. #include <iostream> // std::cout, std::endl, std::cin
  2. #include <stdlib.h> // EXIT_SUCCESS
  3.  
  4. union Unionstruktur
  5. {
  6. int a; // 4 Byte
  7. float b; // 4 Byte
  8. double c; // 8 Byte
  9. };
  10.  
  11. int main(void)
  12. {
  13. Unionstruktur u1;
  14. u1.a = 10;
  15. std::cout << u1.a << std::endl; // 10
  16. u1.b = 2.574f;
  17. std::cout << u1.a << std::endl; // 1076149354
  18. u1.c = 3.654;
  19. std::cout << u1.a << std::endl; // 1511828488
  20. std::cout << u1.c << std::endl; // 3.654
  21.  
  22. std::cout << sizeof (Unionstruktur) << std::endl; // 8 Byte
  23.  
  24. std::cin.get();
  25. return EXIT_SUCCESS;
  26. }

Mit Union kann genauso verfahren werden wie mit struct (Pointer, Verschachtelung usw..)


Die Members von Strukturen und Unions sind öffentlich zugänglich (public), wenn nichts anderes vereinbart wird. Wie bei Klassen kann der Zugriff auf protected oder private eingeschränkt werden. (Der einzige Unterschied zwischen einer Klasse und einer Struktur besteht in C++ tatsächlich darin, dass der Default-Zugriff bei einer Klasse private ist, bei einer Struktur hingegen public.)

Kommentare zu diesem Beitrag

Sie müssen angemeldet sein, um eine Nachricht zu erstellen. Anmelden »