C-Propädeutikum Höhere Datentypen Dipl.-Inf. Stefan Freitag freitag@uni-leipzig.de Universitätsrechenzentrum Universitätsbibliothek Universität Leipzig basiert auf den Originalfolien von Jörn Hoffmann
Höhere Datentypen Überblick Höhere Datentypen Werden Mithilfe von primitiven Datentypen definiert Unterscheidung: Statische vs. dynamische Anlegung Strukturierte Datentypen Inhalt 1. Felder int i[10] 2. Strukturen struct, union 3. Aufzählung enum {schwarz, weiß} 4. Pointer int *i; Stefan Freitag C-Propädeutikum Folie 2
Felder Institut für Informatik Felder engl. Array Zusammenfassung von gleichartigen Elementen eines Typs Belegen aufeinander folgende Speicherplätze Ansprechen über ein oder mehrere Indizes Eindimensionale Felder (Vektoren) Mehrdimensionale Felder (Matrizen) Nutzen Zusammenfassung gleicher Typen Zeichenketten Stefan Freitag C-Propädeutikum Folie 3
Eindimensionale Felder Institut für Informatik Syntax Deklaration : Typ Feldname[Anzahl_n]; Ansprechen : Feldname[Index_i] Semantik Deklaration: Reservierung von Speicherplätzen für eine Folge von n- Elementen eines Typs Ansprechen: Auswahl des i-ten Element zwischen [0..n-1] Feld startet mit Index 0 Feld mit n Elementen endet beim Index n-1 Feldname ist symbolsicher Bezeichner der Anfangsadresse E (0) E (2)... E (n-1) sizeof(typ) Anfangsadresse (Name) Letzter Index Stefan Freitag C-Propädeutikum Folie 4
Eindimensionale Felder Beispiel Beispiel // felder.c int index, ungeradezahlen[10]; // Typische Art ein Feld mittels For-Schleife zu durchlaufen for (index=0; index < 10; index++) ungeradezahlen[index] = 2*index + 1; // Ausgabe des Feldes for (i=0; i < 10; i++) printf( Index %d = %d\n, i, feld[i]); Stefan Freitag C-Propädeutikum Folie 5
Eindimensionale Felder Initialisierung Initialisierung Zuweisung von Anfangswerten bei der Definition Spätere Zuweisungen müssen manuell erfolgen // Konkrete Angabe der Elementanzahl und Initialisierung int werte[4] = {2, 3, 4, 5}; // Implizite Angabe der Elementanzahl durch sofortige Initialisierung float messdaten[] = {32.6, 25.4, 10.8, 8.2}; // Unvollständige Initialisierung, restlichen Elemente haben Wert 0 double kontostand[3] = {100}; Stefan Freitag C-Propädeutikum Folie 6
Eindimensionale Felder Speicheradressierung Speicheradressierung Felder sind Speicherplatzadressen in C Feldname ist Synonym für Startadresse des Speicherbereichs Elemente liegen sizeof(typ) Byte auseinander Ein Element belegt sizeof(typ) Byte Feld mit n Elementen belegt n*sizeof(type) Byte Ermittlung der Speicherstelle mittels Adressoperator & Stefan Freitag C-Propädeutikum Folie 7
Eindimensionale Felder Speicheradressierung Beispiel // felder2.c #include <stdio.h> int main() { int i, a[4] = {10, 11, 12, 13}; // Ausgabe der Speicheradressen des Arrays a for (i=0; i < 5; i++) printf("&a[%d]=%d\n", i, (int)&a[i]); return 0; } Ausgabe: &a[0]=..528 &a[1]=..532 &a[2]=..536 &a[3]=..540 // Potentiell unterschiedlich Stefan Freitag C-Propädeutikum Folie 8
Mehrdimensionale Felder Institut für Informatik Syntax Deklaration : Typ Feldname[Anzahl_m][Anzahl_n][..]; Ansprechen : Feldname[Index_i][Index_j][..] Semantik Zwei und mehrdimensionale Felder möglich Deklaration: Reservierung von Speicherplatz für eine Folge von n*m Elementen eines Typs Auswahl des i,j-ten Elements zwischen [0..m-1][0..n] Feld startet mit Index [0][0] Feld mit (n*m)-elementen endet beim Index [m-1][n-1] Feldname ist symbolsicher Bezeichner der Anfangsadresse Stefan Freitag C-Propädeutikum Folie 9
Mehrdimensionale Felder Beispiel Beispiel int i, j, matrix[3][4]; matrix[0][0] = 1; matrix[2][0] = 9; matrix[2][3] = 12; // Erstes Element // Erstes Element, der letzten Zeile // Letztes Element // Ausgabe des Feldes for (i=0; i < 3; i++) for (j=0; j < 4; i++) printf( [%d][%d] = %d\n, i, j, matrix[i][j]); Stefan Freitag C-Propädeutikum Folie 10
Mehrdimensionale Felder Initialisierung Initialisierung Zuweisung von Anfangswerten bei der Definition Spätere Zuweisungen müssen manuell erfolgen // Konkrete Angabe der Speicherplätze und Initialisierung int werte[3][4] = {{00, 01, 02, 03}, {10, 11, 12, 13}, {20, 21, 22, 23}}; // Implizite Angabe der Speicherplätze durch sofortige Initialisierung // Letzte Feldgröße muss bekannt sein float messdaten[][2] = {{32.6, 25.4}, {10.8, 8.2}, {20.1}{15.0}}; // Unvollständige Initialisierung, restlichen Elemente haben Wert 0 double matrix[3][3] = {{100, 65}, {1}}; Stefan Freitag C-Propädeutikum Folie 11
Eindimensionale Felder Speicheradressierung Speicheradressierung Wie bei eindimensionalen Feldern Adressberechnung für Stelle (i,j) im int array[m][n] i*m*sizeof(int) + j*sizeof(int) Ermittlung der Speicheradresse mittels &-Adressoperator Stefan Freitag C-Propädeutikum Folie 12
Eindimensionale Felder Speicheradressierung // matrix.c #include <stdio.h> #define M 3 #define N 4 int main() { int i, j, matrix[m][n]; // Ausgabe aller Speicheradressen der Matrix-Komponenten for (i=0; i < M; i++) { for (j=0; j < N; j++) printf("&a[%d][%d] =..%.3d\n", i, j, (int)&matrix[i][j] % 1000); } } printf("\n"); return 0; Ausgabe: // Potentiell unterschiedlich &a[0][0]=..72 &a[0][1]=..76 &a[0][2]=..80 &a[1][0]=..84 &a[1][1]=..88 &a[1][2]=..92 Folie 13
Strukturen Institut für Informatik Strukturen Zusammenfassung verschiedener Komponenten zu einer Einheit Komponenten können unterschiedliche Datentypen haben Nutzen Abspeicherung zusammengehöriger Daten Modellierung von Objekten Stefan Freitag C-Propädeutikum Folie 14
Strukturen Einfache Strukturen Syntax Deklaration: struct Strukturname { Typ1 Variablenname1;.. Typ_n Variablenname_n; } [Variablename]; Definition : struct Strukturname Strukturvariable; Ansprechen : Strukturvariable.Variablenname_i Semantik Deklaration : Bekanntmachung einer Struktur mit n Komponenten Definition : Speicherreservierung für zuvor deklarierte Struktur Ansprechen : Auswahl einer Komponenten Stefan Freitag C-Propädeutikum Folie 15
Strukturen Einfache Strukturen Beispiel struct mitarbeiter { char name[50]; // Nachname float gehalt; // Jahresgehalt in int parkplatz; // 0=nein, 1=ja }; struct Mitarbeiter a, b; struct Mitarbeiter team[10]; // Zwei einzelne Mitarbeiter // Feld mit 10 Mitarbeitern Stefan Freitag C-Propädeutikum Folie 16
Strukturen Einfache Strukturen Initialisierung struct mitarbeiter { char name[50]; // Nachname float gehalt; // Jahresgehalt in int parkplatz; // 0=nein, 1=ja }; // Vollständig struct Mitarbeiter a = { Mustermann, 42000, 1}; // Unvollständig mittels Punktoperator struct Mitarbeiter m = {.name= Mustermann,.parkplatz=1}; Stefan Freitag C-Propädeutikum Folie 17
Typdefinitionen Institut für Informatik Typdefinition von Strukturen Strukturen werden oft als neuer Typ definiert Einspart Tipparbeit, da struct entfällt Typdefinition kann bereits bei Deklaration erfolgen Syntax typedef Typ Alias; Beispiele typedef struct mitarbeiter mitarbeiter_t; typedef struct _student { long matrikel; char *name; } student_t; // Bezeichner irrelevant, kann entfallen // Speicher muss später dynamisch allokiert werden Stefan Freitag C-Propädeutikum Folie 18
Strukturen Einfache Strukturen Beispiel // mitarbeiter.c typedef struct { char name[strlen]; float gehalt; int parkplatz; } mitarbeiter_t; mitarbeiter_t a = {"Mustermann", 42000, 1}; mitarbeiter_t b = {.name = "Mustermann",.parkplatz=1}; mitarbeiter_t team[10] = {a, b}; Stefan Freitag C-Propädeutikum Folie 19
Strukturen Variante Strukturen Variante Strukturen Zugriff auf Struktur über mehrere Varianten Einfache Struktur : Speicher liegt hintereinander Variante Struktur : Speicher liegt übereinander Selber Platz wird für verschiedenartige Datentypen genutzt Komponenten beginnen mit selber Speicheradresse Komponenten enden mit unterschiedlicher Adresse Nutzen Generische Abspeicherung ähnlicher Datentypen Typkonventionen Stefan Freitag C-Propädeutikum Folie 20
Strukturen Variante Strukturen Syntax Wie bei Strukturen union Strukturname { Typ1 Variable1;... Typ_n Variable_n; } [Variablenname]; Semantik Variable 1..n überdecken sich Stefan Freitag C-Propädeutikum Folie 21
Strukturen Variante Strukturen Beispiel // Siehe auch endianness.c union U2 { int zahl; char byte[4]; short shrt; }; Zahl Byte[0] Byte[1] Byte[2] Byte[3] shrt Stefan Freitag C-Propädeutikum Folie 22
Aufzählungen Institut für Informatik Aufzählungen (enum) Aufzählungstyp (keine Struktur) Zur Deklaration von Konstanten Abspeicherung als Integer-Wert Nutzen Aufzählung Benennung von Fällen zur Fallunterscheidung Definition von semantisch ähnlichen Konstanten {true, false} Stefan Freitag C-Propädeutikum Folie 23
Aufzählungen Institut für Informatik Syntax enum Typname { Konstante_1 [= Wert], Konstante_2 [= Wert],... Konstante_n [= Wert]; }; Semantik Festlegung von definierten Konstanten Automatische Wertbelegung durch Hochzählung Werte beginnen bei 0 Nachfolger um eins erhöht Stefan Freitag C-Propädeutikum Folie 24
Aufzählungen Institut für Informatik Beispiele // enum.c enum farbe {ROT, GRUEN, BLAU}; typedef enum { status_undef = 0, status_success, status_abort, status_error = 255 }status_t; status_t status = status_abort; Stefan Freitag C-Propädeutikum Folie 25