ein Kapitel zurück                                           ein Kapitel weiter

Bevor unsere Datenstrukturen dynamisch werden werde ich Ihnen erst mal die Grundlagen zeigen. Fangen wir mit dem einfachsten an. Was machen sie wenn sie ein Programm schreiben sollen das Adressen verwalten soll? Folgende Datentypen sind definiert...

char vname[20];
char nname[20];
int PLZ;
char ort[20];
int geburtsjahr;

Nun wenn sie jetzt das Adressprogramm schreiben wollen, müssten sie alle Parameter für Einlesen, Bearbeiten und Ausgeben den Wert einzeln übergeben. Ziemlich umständlich! Nun dafür gibt es Strukturen. Jetzt unser Adresssatz mal in einer Struktur....

struct adres    {  char vname[20];
                   char nname[20];
                   long PLZ;
                   char ort[20];
                   int geburtsjahr;
                 }adressen;

So jetzt haben wir unseren Adresssatz in ein Struktur Namens 'adres' gepackt. Die Sichtbarkeit und die Lebensdauer von Strukturen ist dieselbe wie bei einfachen Variablen. Der Inhalt unserer Struktur 'adres' wird in geschweifte Klammern gepackt. Am Ende der geschweiften Klammern steht der Name ('adressen') über den wir auf die Struktur 'adres' zugreifen.

Folglich sieht der Syntax einer Struktur folgendermaßen aus...

struct typNAME {
          Datentyp1;
          Datentyp2;
          .........
          Datentypn;
               }structNAME;

Als Datentypen können sie hier jeden, den sie bisher kennen gelernt haben verwenden. Auch und vor allem Zeiger lassen sich prima dafür verwenden. Aber dazu später mehr.


Wie kann man sich nun eine Struktur bildlich vorstellen? Beispiel...

struct


In diesem Beispiel haben wir einen Typ Namens index definiert. Dieser Typ kann einen int-Wert und einen String mit 30 Zeichen aufnehmen. Folglich beträgt die Gesamtgröße der Struktur 34 Bytes (auf 16 Bit-Systemen 32 Bytes, da int==2 Bytes).

Die nächste wichtige Frage dürfte sein: Wie bekomme ich die Werte in diese Variablen bzw. wie greife ich auf die einzelnen Variablen in der Struktur zu?
Auch das ist nicht schwer. Zugegriffen wird auf die einzelnen Variablen, mit Hilfe des Punktoperators (.). Ansonsten läuft es genauso ab wie bei einer normalen Variable....



Mittels.....

struct index lib;

...erzeugen wir ein Variable Namens lib vom "Datentyp" index. Diese Extra-Definition könnten wir uns sparen wenn wir folgende Schreibweise verwenden.......

struct index {
              int seite;
              char titel[30];
             }lib;

Und wenn wir den Typennamen ebenfalls nicht benötigen könnten wir unsere Struktur auch so definieren......

struct {
        int seite;
        char titel[30];
       }lib;

Es spricht auch nichts dagegen mehrer Typen zu definieren....

struct index {
              int seite;
              char titel[30];
             }lib1, lib2, lib3;

Hier haben wir gleich 3 Variablen vom Typ index definiert. Die Strukturen können natürlich, wie normale Datentypen auch, direkt bei der Definition mit einem Wert initialisiert werden....

struct index {
              int seite;
              char titel[30];
             }lib = { 55, "Strukuren 2" };

...oder in der main-Funktion...

struct index lib = { 55, "Strukturen 2" };

Wenn es ihnen jetzt etwas wirr im Kopf wird, keine Sorge, jetzt kommen wir zur Praxis.

Jetzt werde ich ihnen ein kleines Programm zeigen wie sie auf den Inhalt der Struktur zugreifen können und ihm ein Wert zuweisen können...

/*Download:struct1.c*/
/*struc1.c*/ #include <stdio.h> struct adres { char vname[20]; char nname[20]; long PLZ; char ort[20]; int geburtsjahr; }adressen; /*Funktion zur Ausgabe des Satzes*/ void ausgabe(struct adres x) { printf("\n\nSie gaben ein:\n\n"); printf("Vorname.........:%s\n",x.vname); printf("Nachname........:%s\n",x.nname); printf("Postleitzahl....:%ld\n",x.PLZ); printf("Ort.............:%s\n",x.ort); printf("Geburtsjahr.....:%d\n",x.geburtsjahr); } int main() { printf("Vorname : "); gets(adressen.vname); printf("Nachname : "); gets(adressen.nname); printf("Postleitzahl : "); scanf("%ld",&adressen.PLZ); fflush(stdin); printf("Wohnort : "); gets(adressen.ort); printf("Geburtsjahr : "); scanf("%d",&adressen.geburtsjahr); ausgabe(adressen); return 0; }

Am Anfang haben wir unsere Struktur die ich oben schon beschieben habe. Anschließend wollen wir mit der main - Funktion beginnen. Mit.....

gets(adressen.vname);

..geben wir unseren Vorname ein. Der Zugriff auf die Struktur erfolgt erst über den Namen unsere Struktur dann kommt ein Punkt und anschließend welcher Variablen unserer Struktur wir einen Wert übergeben wollen. Wenn wir den Vornamen direkt an unsere Struktur übergeben wollen, ohne gets() können sie das so machen....

strcpy(adressen.vname , "Bill");

Hier könnten sie alternativ falls sie die Postleitzahlen direkt im Programm initialisieren wollen so schreiben...

adressen.PLZ = 89000;

Hiermit übergeben wir den Wert direkt an die Struktur Namens 'adressen' vom Typ 'adres'. Anschließend folgen noch Wohnort und Geburtsjahr. Jetzt rufen wir unser Funktion 'ausgabe' mit...

ausgabe(adressen);

..auf und übergeben als Parameter Struktur Namens 'adressen'. Anschließend wird unsere Eingabe auf dem Bildschirm ausgegeben.

Anhand diesem Aufrufes können sie auch sehen, dass Strukturen genauso wie jeder andere Datentyp, außer bei Arrays, an Funktionen per Call-by-Value übergeben werden kann. Die Funktion bekommt eine Kopie der komletten Struktur. Bitte beachten sie das dieses Anlegen einer Kopie bei häufigeren Funktionsaufrufen und längeren Strukturen, die Laufzeit des Programms erheblich einbremsen kann! Genauso kann eine Funktion einen Struktur zurückgeben, in dem folgendermaßend definiert wird......



struct typNAME Funktionsname()

Ein kleiner Tipp wie sich sich Strukturen besser Vorstellen können falls noch nicht geschehen....

Nehmen wir z.B. zum Vergleich : int x; und char c;....

Typ Name
int x
char c
struct adres adressen


Wenn sie jetzt 'int x' einen Wert zuweisen machen sie das so....

x=1999

Bei der Struktur kommt noch ein kleiner Zusatz hinzu, wir geben z.B aus unserem Programm unserer Variablen 'int geburtsjahr' einen Wert....

adressen.geburtsjahr=1999;

Sie müssen aber bei Strukturen beachten was für einen Variablentypen (char,int,long....) sie einen Wert übergeben.

Ein weitere Möglichkeit unsere Struktur sofort mit einem Inhalt zu initialisieren ist diese...

stuct adres { char vname[20];
              char nname[20];
              int PLZ;
              char ort[20];
              int geburtsjahr;
             }adressen ={
               "Ernest", "Hemming" ,3434, "Havanna" ,1913};

Bitte vermeiden sie folgende Wertzuweisung von Strukturen.........

struct {
   int a1;
   int a2;
   int a3;
   }werte1,werte2;

werte1.a1=8;
werte1.a2=16;
werte1.a3=32;

werte2=werte1;   /*Bitte vermeiden sie soetwas*/

Dies ist zwar erlaubt in C, aber kann zu Fehlern führen wenn ein Compiler dies nicht unterstützt. Verwenden sie daher, auch wenn es bei Ihnen läuft, folgende Kopierweise...

memcpy(&werte2,&wert1, sizeof(werte1));

Dies soll nur ein Hinweis sein und keine Regel!

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf