⬅️ Seite zurück⬆️ Inhaltsverzeichnis

🤪 Kapitel 1.05.2 - Zusammengesetzte Datentypen

Anfang der 1990’er Jahre hat Karl Bihlmeier eine Comicfigur entwickelt, die bei Amiga Fans zum Kult wurde.<br>Es war „Hermann der User“, er beschäftigt sich mit den typischen Problemen eines Computer-Nerd in und mit seinem Umfeld.<br>Veröffentlicht wurden diese unter anderem im „Amiga Magazin“ des Markt & Technik Verlags.<br>Vielen Dank an Karl Bihlmeier für die Erlaubnis zur Veröffentlichung 😉<br>
Anfang der 1990’er Jahre hat Karl Bihlmeier eine Comicfigur entwickelt, die bei Amiga Fans zum Kult wurde.
Es war „Hermann der User“, er beschäftigt sich mit den typischen Problemen eines Computer-Nerd in und mit seinem Umfeld.
Veröffentlicht wurden diese unter anderem im „Amiga Magazin“ des Markt & Technik Verlags.
Vielen Dank an Karl Bihlmeier für die Erlaubnis zur Veröffentlichung 😉

🤪 Was sind zusammengesetzte Datentypen?

Zusammengesetzte Datentypen oder Komplexe Datentypen bestehen aus mehreren atomaren Datentypen, die als gesamte Einheit behandelt werden. Im Gegensatz zu atomaren Typen, können diese nicht direkt von der CPU “am Stück” verarbeitet werden - Es existieren Hilfsfunktionen, die diese verarbeiten. Diese arbeiten (meist) transparent im Hintergrund. Zum Beispiel, wenn ein Objekt dupliziert wird.

🤪 Die wichtigsten Beispiele

  • Array:
    In einem Array werden Datentypen in einer Gruppe zu n-Elementen zusammengefasst. Diese sind dann über einen Index zugänglich, in C beginnen alle Indizes immer bei 0. Der Index wird immer in [eckige Klammern] eingeschlossen.
  • Klassische Zeichenkette:
    Die bekannteste Form eines Array ist die Zeichenkette. Beispiel:
    char Test[] = "Ich bin eine Zeichenkette";

    "Test" besteht jetzt aus einer Folge von "char" unter der Haube fügt der Compiler aber noch ein Zeichen hinzu, den Null-Terminator. In C müssen alle Zeichenketten mit einen Null-Terminator abgeschlossen sein, er bestimmt das Ende der Zeichenkette. In anderen Programmiersprachen (z.B. Pascal) steht im ersten Byte wie vielen Zeichen in der Zeichenkette enthalten sind. Bei C/C++ ist dieses Vehalten so gewollt, da die Binäre Null eine besondere Rolle spielt. Dazu aber im nächsten Teil mehr zu dem Verhalten von C, wenn es um den Aufbau eines Programms geht - Oder anders gefragt: Was ist Programmieren?
    Im Speicher steht jetzt:
    00000000  49 63 68 20 62 69 6e 20  65 69 6e 65 20 5a 65 69  |Ich bin eine Zei|
    00000010  63 68 65 6e 6b 65 74 74  65 00                    |chenkette.|

  • Multibyte (↗ Unicode, ↗ UTF-8) Zeichenkette:
    Zum Zeitpunkt der Entstehung von C gab es die ↗ ASCII Zeichenkodierung für Fernschreiber. Diese hat den Umfang von 127 Zeichen welche mit 7 Bits beschrieben werden kann. Praktischerweise hat der “char” Datentyp den Umfang von 8 Bit und als vorzeichenbehafteter Datentyp sind somit 7 Bit frei nutzbar. So weit, so unspektakulär.

    Ende der 1970’er Jahre wurde aber damit begonnen, den ASCII Code um Länderspezifische Zeichen zu erweitern, den damaligen ↗ Codepages. Nämlich im Bereich 128 - 255. Damit wurde das 8. Bit ebenfalls genutzt was aber zu Probleme in der Programmlogik führte. Es gab keine Möglichkeit zu unterscheiden, welche Codepage gemeint war. Mit der Einführung des Unicode wurde versucht, alle Sprachen und spezielle Zeichen in eine einzige Codepage zusammenzufassen um sicherzustellen, das zum Beispiel das deutsche “ö” kein französisches “é” ist.

    Das Problem war aber, das die 255 möglichen Zeichen im “char” Datentyp dafür viel zu gering ist. Um bestehende Programme nicht zu ändern oder anzupassen wurde eine Kodierung gewählt, die es erlaubte Unicodetexte so zu verarbeiten, als währen sie normale ASCII Texte. Das Zauberwort hierzu ist ↗ UTF-8.

    Nochmal ein Historischer Einwurf:
    Ein Problem war auch - Dies besteht übrigens noch bis zum heutigen Tag - das die Nutzung des 8. Bit den Wert von “char” negativ macht, da “char” vorzeichenbehaftet ist. Viele Programmierer nutzten negative Werte zur Übermittelung von Statusinformationen, dies kollidierte dann mit Texten, die den Erweiterten ASCII Code nutzten. Die Lösung war die Einführung von ↗ UTF-7, eine Kodierung die nur die unteren 7 Bit nutzt und somit “sicher” durch solche älteren Programme übertragen werden. Vor Unicode wurde aus dem selben Grund auch die ↗ BASE64 Kodierung entwickelt, die ebenfalls bis zum heutigen Tag benutzt wird um eMails sicher zu übertragen, da sehr viele Mailserver ebenfalls keinen vollständigen 8 Bit Datenstrom durchleiten können.

    Dabei muss aber bedacht werden, das nicht mehr die Regel gilt, dass das 3. Zeichen in Text an der 3. Position im Speicher ist. Bei der UTF-8-Kodierung, kann ein Zeichen bis zu vier Byte belegen. Bei der Verarbeitung von Texten ist nunmehr dieser Umstand zu berücksichtigen. Ein Beispiel, der Text “Testtext 123 als UTF8” sieht im Speicher so aus:
    00000000  54 65 73 74 74 65 78 74  20 31 32 33 20 61 6c 73  |Testtext 123 als|
    00000010  20 55 54 46 38 00                                 | UTF8.|

    Nach der Änderung der “2” in einen Smiley ist der Text aber drei Byte länger geworden. “Testtext 1🤪3 als UTF8” sieht im Speicher so aus:
    00000000  54 65 73 74 74 65 78 74  20 31 f0 9f a4 aa 33 20  |Testtext 1....3 |
    00000010  61 6c 73 20 55 54 46 38  00                       |als UTF8.|

    Die Zahlen (in Hexadezimaler Schreibweise) 0xF0 0x9F 0xA4 0xAA repräsentieren jetzt das 🤪 Symbol.

Alle Downloads zu diesem Projekt:
💾 DatentypenZusammengesetzt.c
💾 DatentypenZusammengesetzt.pro


Inhalt von: DatentypenZusammengesetzt.c
..1: //+------------------------------------------------------------------
..2: //|
..3: //| Projekt              : Kapitel1 - DatentypenZusammengesetzt
..4: //| Versionsnummer       : V1.00
..5: //| Projektbeschreibung  : Vorstellung der wichtigsten zusammengesetzter
..6: //|                      : Datentypen unter C
..7: //|
..8: //| Autor                : Salomo Sokoll - ss@salomo-sokoll.de
..9: //| Programmierung mit C und C++ ohne ideologischen Ballast
.10: //| https://salomo-sokoll.de/Buch/C_CPP/index.html
.11: //|
.12: //+------------------------------------------------------------------
.13:
.14: // Einbinden aller benötigten Header-Dateien (.h)
.15: #include "stdio.h"
.16:
.17: int main( )
.18: {
.19:
.20:     // *
.21:     // ** Arrays (Zeichenkette)
.22:     // *
.23:
.24:     char    Test[] = "Ich bin eine Zeichenkette";
.25:
.26:     printf( "%s\n", Test );
.27:
.28:     // *
.29:     // ** Arrays (Zeichenkette Multibyte (Unicode UTF8)
.30:     // *
.31:
.32:     char    Unicode1[] = "Testtext 123 als UTF8";
.33:     char    Unicode2[] = "Testtext 1🤪3 als UTF8";
.34:
.35:     printf( "%s - Laenge im Speicher: %d\n", Unicode1, ( int ) sizeof( Unicode1 ) );
.36:     printf( "%s - Laenge im Speicher: %d\n", Unicode2, ( int ) sizeof( Unicode2 ) );
.37:
.38:     return( 0 );
.39: }
.40:

Inhalt von: DatentypenZusammengesetzt.pro
..1: #+------------------------------------------------------------------
..2: #|
..3: #| Projekt              : Kapitel1 - DatentypenZusammengesetzt
..4: #| Versionsnummer       : V1.00
..5: #| Projektbeschreibung  : Vorstellung der wichtigsten zusammengesetzter
..6: #|                      : Datentypen unter C
..7: #| Lauffähig unter      : Alle Systeme / Compiler ab ANSI-C 1999
..8: #|
..9: #| Autor                : Salomo Sokoll - ss@salomo-sokoll.de
.10: #| Programmierung mit C und C++ ohne ideologischen Ballast
.11: #| https://salomo-sokoll.de/Buch/C_CPP/index.html
.12: #|
.13: #+------------------------------------------------------------------
.14:
.15: TARGET      = DatentypenZusammengesetzt
.16: TEMPLATE    = app
.17:
.18: SOURCES     += DatentypenZusammengesetzt.c


Das Programm sollte diese Ausgabe liefern:
Ich bin eine Zeichenkette
Testtext 123 als UTF8 - Laenge im Speicher: 22
Testtext 1🤪3 als UTF8 - Laenge im Speicher: 25


Erstellt durch: MuseumsWelt V6.04.01 Edition 'In memoriam 😢 Röhrensammlung' / EU Datenschutz-Grundverordnung (DSGVO)
Erstellt am: 22.07.2026 18:03