C- Kurs 07 Höhere Datentypen Dipl.- Inf. Jörn Hoffmann jhoffmann@informa?k.uni- leipzig.de Universität Leipzig Ins?tut für Informa?k Technische Informa?k
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; Jörn Hoffmann C-Kurs 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 Jörn Hoffmann C-Kurs 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 Jörn Hoffmann C-Kurs 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]); Jörn Hoffmann C-Kurs 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}; Jörn Hoffmann C-Kurs 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 & Jörn Hoffmann C-Kurs 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 // Potentiell unterschiedlich &a[1]=..532 &a[2]=..536 &a[3]=..540 Jörn Hoffmann C-Kurs 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 Jörn Hoffmann C-Kurs Folie 9
Mehrdimensionale Felder Beispiel Beispiel int i, j, matrix[3][4]; matrix[0][0] = 1; matrix[2][0] = 9; matrix[2][3] = 12; // Ausgabe des Feldes for (i=0; i < 3; i++) for (j=0; j < 4; i++) // Erstes Element // Erstes Element, der letzten Zeile // Letztes Element printf( [%d][%d] = %d\n, i, j, matrix[i][j]); Jörn Hoffmann C-Kurs 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}}; Jörn Hoffmann C-Kurs 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 Jörn Hoffmann C-Kurs 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 Jörn Hoffmann C-Kurs 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 Jörn Hoffmann C-Kurs Folie 15
Strukturen Einfache Strukturen Beispiel struct mitarbeiter { }; char name[50]; // Nachname float gehalt; // Jahresgehalt in int parkplatz; struct Mitarbeiter a, b; // 0=nein, 1=ja // Zwei einzelne Mitarbeiter struct Mitarbeiter team[10]; // Feld mit 10 Mitarbeitern Jörn Hoffmann C-Kurs Folie 16
Strukturen Einfache Strukturen Initialisierung struct mitarbeiter { }; char name[50]; // Nachname float gehalt; // Jahresgehalt in int parkplatz; // Vollständig // 0=nein, 1=ja struct Mitarbeiter a = { Mustermann, 42000, 1}; // Unvollständig mittels Punktoperator struct Mitarbeiter m = {.name= Mustermann,.parkplatz=1}; Jörn Hoffmann C-Kurs 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 // Bezeichner irrelevant, kann entfallen { long matrikel; char *name; // Speicher muss später dynamisch allokiert werden } student_t; Jörn Hoffmann C-Kurs 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 mitarbeiter_t b = {.name = "Mustermann",.parkplatz=1}; team[10] = {a, b}; Jörn Hoffmann C-Kurs 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 Jörn Hoffmann C-Kurs Folie 20
Strukturen Variante Strukturen Syntax Wie bei Strukturen union Strukturname { Typ1 Variable1;... Typ_n Variable_n; } [Variablenname]; Semantik Variable 1..n überdecken sich Jörn Hoffmann C-Kurs 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 Jörn Hoffmann C-Kurs 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} Jörn Hoffmann C-Kurs 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 Jörn Hoffmann C-Kurs 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; Jörn Hoffmann C-Kurs Folie 25