3    Basisdatentypen in C

In diesem Kapitel geht es um die Basisdatentypen, ohne die Sie kein vernünftiges Programm schreiben und auch kaum eine sinnvolle Berechnung ausführen können. Außerdem werden sämtliche komplexen Datenstrukturen von den einfachen Datentypen abgeleitet.

Ebenso wie Sie nicht ohne Kochtopf kochen können, funktioniert eine Programmiersprache nicht ohne grundlegende Datentypen, mit deren Hilfe Sie Zahlen in einer Variablen ablegen können. Ebenso wenig würde die Mathematik ohne Variablen funktionieren, von denen die bekannteste wahrscheinlich x ist. Auf ähnliche Weise funktionieren die Variablen in C: Man kann für Variablen jederzeit den entsprechenden Wert einsetzen. Während Sie allerdings in einen Kochtopf alles Mögliche hineinschneiden können, müssen Sie bei den Basisdatentypen genau auf die »Zutaten« achten. Dies ist auch in der Mathematik so, wo Sie auch nicht mit allem alles tun dürfen. In C sind hierfür von Haus aus Datentypen für Ganzzahlen, Fließkommazahlen und Zeichen vorhanden. Diese sogenannten primitiven Datentypen müssen Sie nicht extra definieren, denn sie sind dem Compiler von vornherein bekannt und funktionieren, ohne dass Sie zusätzliche Bibliotheken einbinden müssen.

3.1    Variablen

Bevor wir Ihnen Variablen näherbringen, müssen wir ein paar Worte über Speicheradressen verlieren, weil diese in C sehr wichtig sind. Sicherlich wissen Sie, dass Ihr Computer Speicher besitzt, und möglicherweise haben Sie schon einmal welchen in Ihren PC eingebaut.

Aber wie legt Ihr PC die Daten im Speicher ab, und woher weiß er, wo er diese vorher abgelegt hat? Die Antwort ist, dass Ihr Prozessor eine interne Schaltung besitzt – den sogenannten Adressbus – der Ihren Speicherbaustein anspricht und die Positionen der einzelnen Zeichen, die in diesem Speicherbaustein stehen, auf Zahlen abbildet. Diese Zahlen geben dann z. B. an, dass sich ein bestimmtes Zeichen an der 1000. Position befindet. Genau diese Positionsangabe ist die Speicheradresse. Da ein Zeichen des Ausführungszeichensatzes, das oft im ASCII-Code codiert ist, ein Byte (also 8 Bits) umfasst, gibt die Speicheradresse die Position des entsprechenden Bytes im Speicher an. Der Prozessor hat nun spezielle Befehle, um diese Bytes aus dem Speicher zu lesen und an einer bestimmten Position in diesem abzulegen. An dieser Position kann zum Beispiel der Inhalt einer Variablen stehen.

Eine Variable ist damit im Grunde genommen nichts anderes als eine Adresse im Hauptspeicher. Dort legen Sie die Daten ab und greifen später, wenn Sie den Inhalt wieder benötigen, auf sie zurück. Auch dies erledigen spezielle Prozessorbefehle und einige interne Speicherstellen, die Register genannt werden. Wie dies im Einzelnen funktioniert, brauchen Sie nicht im Detail zu verstehen. Sie müssen nur wissen, dass alle Variablen eine konkrete Speicheradresse besitzen, die der Compiler zusammen mit dem Namen in einer Variablentabelle ablegt.

Um nun programmtechnisch ohne kryptische Adressangaben und Prozessorbefehle wie MOV EAX,[DS:ESI] auf diese Adressen im Arbeitsspeicher zurückgreifen zu können, benötigen Sie einen eindeutigen Namen. Genau dies ist der Bezeichner. Der Compiler wandelt diesen Namen dann später in eine Adresse um und erzeugt auch die Variablentabelle automatisch. Natürlich belegt jede dieser Variablen einen gewissen Speicherplatz. Wie viel das ist, hängt davon ab, welchen Datentyp Sie verwendet haben, wie viel Platz dieser auf einem bestimmten System beansprucht und mit welchen Werten er implementiert wurde. Der Standard schreibt hier nur eine Mindestgröße für die einzelnen Typen vor.