Programmieren
 
 
 
 
 
C-Grundkurs

 
 
 
 
.. Zeiger auf Varianten und Strukturen
 
 

 
 
 
 


Zeiger funktionieren bei Strukturen (struct) und Varianten (union) nicht anders als bei anderen Variablentypen auch. Dem Zeiger kann der Ort (die Adresse) an dem sich die Struktur im Hauptspeicher befindet eingeschrieben werden und über eine indirekte Adressierung kann er dann auf die Untervariablen (die Member oder Mitglieder) der Struktur zugreifen.

Um diese indirekte Adressierung einzuleiten, muss jedoch zwischen Zeigername und Untervariable das Zeichen '->' anstelle des Zeichens '.' der direkten Adressierung geschrieben werden. So bezeichnen im Beispiel unten ..


geb.tag (direkt) und prt1->tag (indirekt) jeweils die gleiche Untervariable.


Einen interessanten Aspekt bietet die Methode der typedef Deklaration einer Struktur (s.Beispiel unten). Es werden bei ihr zwei verschiedene Typen erklärt, die durch Komma getrennt aufgeführt sind. Einmal ein Typ für die direkte Adressierung der Struktur mit der Bezeichnung geburt und einmal ein Typ, der einen Zeiger auf diesen Strukturtyp ableitet, mit Namen *gebptr.


Das was *gebptr leistet, hätte man auch bei der normalen Ableitung eines Zeigers durch geburt* erhalten. Ob man also schreibt gebptr zeiger oder geburt* zeiger ist egal, beides ergibt identische Zeiger auf die Struktur vom Typ geburt.





// struct2.cpp
// ------------  Version 17.06.2002
//               Borland IDE C++ 3.1 oder 5.02
//               Model:  SMALL
//               Char:   unsigned
//               bearbeitet: D.Schwarzer, www.GoBlack.de

// Hardware:     jeder DOS-PC

#include <stdio>         // für printf()
#include <conio>         // für getch()
#include <string.h>      // für strgcpy()


// Deklaration eines Strukturtyps  geburt
// und eines   Strukturzeigertyps *gebptr über typedef.
// Die Strukturerklärung wurde hier einmal auf einzelne Zeilen
// verteilt. Sie besteht aus einem char für den Tag 1-31, einem
// char-Array für Strings von 10 Zeichen für den Namen des Monats
// und einem unsigned für die Jahreszahl.

typedef struct { char      tag;
                 char      mon[10];
                 unsigned  jahr;     }  geburt, *gebptr;

// Alternativ
// struct termin {char tag; char mon[10]; unsigned jahr;};


// Test der Anwendung des Strukturtyps geburt, sowie des
// Strukturzeigertyps *gebptr, sowie der standardmässigen Ableitung
// eines Zeiges aus dem Strukturtyp.
// Über alle drei Elemente wird die Struktur gelesen und neu
// beschrieben  

void main (void)
{
  // Definition der Strukturvariablen geb mit gleichzeitiger
  // Initialisation der Untervariablen tag=12, mon="Dezember"
  // und jahr= 2001.
  
  geburt  geb= {12,"Dezember", 2001};

  // Deklaration zweier Zeigers, die auf Objekte des Strukturtyps
  // geburt zeigen können.
  
  geburt* ptr1;             // Standardversion 
  gebptr  ptr2;             // Benutzung des Struktur-Zeigertyps
                            // der oben mit typedef erklärt wurde

  // Definition und Initialisation der beiden Zeiger. Sie zeigen
  // nun auf das Strukturobjekt geb

  ptr1=&geb;
  ptr2=&geb;

  // Ob das alles stimmt wird durch die dreimalige Ausgabe der
  // Strukturvariablen über das Strukturobjekt geb und die beiden
  // Zeiger ausprobiert.
  // Bei der unmittelbaren Ausgabe werden die Strukturvariable und
  // ihre Untervariablen durch einen . Getrennt
  // Bei den Zeigern muss das Zeichen -> benutzt werden.
  
  printf ("\r\nGeburtstag am: %d %s %d",
                              geb.tag, geb.mon, geb.jahr);
  printf ("\r\nGeburtstag am: %d %s %d",
                              ptr1->tag, ptr1->mon, ptr1->jahr);
  printf ("\r\nGeburtstag am: %d %s %d",
                              ptr2->tag, ptr2->mon, ptr2->jahr);


  // Zuweisung neuer Werte für die Untervariablen, jede auf einem
  // der drei möglichen Wege, direkt, über ptr1 und über prt2. Bei
  // der Neuzuweisung des strings muss die Funktion strcpy() aus
  // der statischen Bibliothek verwendet werden (s.strings)
 
  geb.tag =22;
  strcpy(ptr1->mon, "Januar");
  ptr2->jahr = 2008;
  
  // Zur Kontrolle eine zweite dreifache Ausgabe der neuen
  // Zuweisung wie bereits oben angesprochen.
  
  printf ("\r\nGeburtstag am: %d %s %d",
                              geb.tag, geb.mon, geb.jahr);
  printf ("\r\nGeburtstag am: %d %s %d",
                              ptr1->tag, ptr1->mon, ptr1->jahr);
  printf ("\r\nGeburtstag am: %d %s %d",
                              ptr2->tag, ptr2->mon, ptr2->jahr);

  getch();
}


 

 

 


Bildschirmausgabe des Programms:


Geburtstag am: 12. Dezember 2001

Geburtstag am: 12. Dezember 2001

Geburtstag am: 12. Dezember 2001


Geburtstag am: 22. Januar 2008

Geburtstag am: 22. Januar 2008

Geburtstag am: 22. Januar 2008


 

 
www..de