Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido

Ähnliche Präsentationen


Präsentation zum Thema: "EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido"—  Präsentation transkript:

1 EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido

2 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Gliederung Kapitel 5 Zeiger –Grundbegriffe –Zeiger und Felder –Beispiel: Zeichenketten –Funktionen als Parameter –Mehrdimensionale Felder

3 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Variable hat: –Namen –Typ u.a. Wertebereich, aus dem Werte angenommen werden –Wert (aus dem Wertebereich oder "undefiniert") ist realisiert im Speicher durch: –Speicherplatz, der hat : Adresse Anmerkung: Nicht immer alle Angaben verfügbar !

4 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Variable Anmerkungen: –Adresse: Eindeutiger Identifikator des Speicherplatzes –Größe des Speicherplatzes abhängig vom Typ der Variablen. –Bildliche Darstellungen: oder auch: Wert Adresse Name Typ nicht explizit angegeben ! Wert Adresse Name -99 B 123 Beispiel: Speicherplatz

5 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Grundbegriffe Zeiger Neu: Adressen können jetzt Werte von Variablen sein !! (Typisiert!) Zeiger: –Vereinbarung: T *var ; –var ist Variablenname, der Adressen von Variablen vom Typ "T" annimmt. Typ int -99 B 123C var Beispiel:

6 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Grundbegriffe Zeiger -99 B 123C var Beispiel: Gängige alternative Darstellung: -99 B 123C var Beispiel: -99 B 123C var -99 B var -99 var -99 B 123C var Beispiel:

7 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Grundbegriffe Zeiger Sei var Variablenname: &var liefert die Adresse von var Sei wo Name eines Zeigers (Speicherreferenz), so liefert *wo die Variable, auf die wo zeigt. Referenzen sind typisiert: es wird angegeben, welcher Typ sich hinter einer Adresse verbirgt (z. B. Referenz auf einen Wert vom Typ int ).

8 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Beispiele &k ist die Adresse der ganzen Zahl k, t ist als Zeiger auf eine Variable vom Typ float deklariert, beinhaltet also eine Adresse adr einer derartigen Variablen *t = speichert damit den Wert unter dieser Adresse adr int k; float *t;

9 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Beispiele Deklariert seien int A=1, B=-99; Nach ZeigerA = &A hat ZeigerA also als Wert die Adresse der Variablen A : -99 B 1 A ZeigerA int *ZeigerA, *ZeigerB; D.h.: die Variablen ZeigerA und ZeigerB enthalten Adressen ganzer Zahlen. ZeigerBZeigerA

10 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Beispiele (Forts.) -99 B A ZeigerA Nach *ZeigerA = B enthält der Speicherplatz, dessen Adresse ZeigerA ist, den Wert von B, also: -99 B 1 A ZeigerA Situation nach: B = B * B; 9801 B -99 A ZeigerA ZeigerB ZeigerB = &B; *ZeigerA = *ZeigerB; 9801 B A ZeigerA

11 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Merke *ZeigerA spricht den Speicherplatz an, auf den ZeigerA zeigt: weil ZeigerA eine Referenz ist, gibt *ZeigerA den Inhalt dieser Referenz an (man spricht von Dereferenzieren: von der Referenz/Adresse zum dadurch bez. Speicherplatz übergehen) &B auf der linken Seite einer Zuweisung ist illegal: die Adressen werden von Compiler oder vom Laufzeitsystem gesetzt, aber nicht vom Benutzer

12 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Vertausche zwei Werte Was geschieht in Tausch ? void Tausch (int a, int b) { int temp; temp = a; a = b; b = temp; } Der Tausch bleibt lokal auf die Funktion beschränkt (wg. call by value) Beispiel

13 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Beispiel Was geschieht in AdrTausch ? void AdrTausch(int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; } temp nimmt den Inhalt von * p auf Der Inhalt von * q wird als Inhalt von * p gespeichert Der Inhalt von * q ist der in temp gespeicherte Wert

14 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Beispiel (Bildchen) 30 p -121 q undef temp temp = *p; *p = *q; Dadurch ist sog. call by reference möglich *q = temp; 30 p -121 q 30 temp -121 p q 30 temp -121 p 30 q temp

15 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Felder und Zeiger Sei deklariert int a[10], *pa; Dann: pa = &a[0] setzt pa als Zeiger auf das erste Element von a –x = *pa würde also a[0] nach x kopieren.

16 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Felder und Zeiger pa+1,..., pa+9 zeigen auf die Elemente a[1],...,a[9] –es gilt also *(pa+i) = a[i] für i = 0,..., 9 Allgemein: ist deklariert T *p;(p ist also ein Zeiger auf Elemente vom Typ T ), dann bezeichnet p+i das Element vom Typ T, das von p um i*sizeof(T) entfernt liegt.

17 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Felder und Zeiger pa ist eine Zeiger-Variable, a ist ein anderer Typ, also sind z. B. a=pa, a++ illegal. Bei Funktionsaufrufen werden Felder als aktuelle Parameter als Zeiger auf das jeweils erste Element interpretiert! Damit erklärt sich, daß Kopiere korrekt funktioniert.

18 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Felder und Zeiger void strcpy (char nach[ ], char von[ ]) { int i = 0; while ((nach[i] = von[i]) ! = '\0') i++; } Kopiert bekanntlich die Zeichenkette von in die Zeichenkette nach. Die Zeichenketten werden als Felder dargestellt.

20 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Felder und Zeiger merke: ( *s++ = *t++) ! = '\0' liefert den Wert 0, falls das Ende der Zeichenkette t erreicht ist (dann soll ja auch die while -Schleife abbrechen) die eigentliche Arbeit findet in dieser Zuweisung statt, daher ist der Anweisungsblock in der while -Schleife leer.

21 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Vergleich von Zeichenketten Sind a und b Zeichenketten, so soll der ganzzahlige Wert strcmp(a, b) den lexikographischen Vergleich von a und b ermöglichen. Es soll gelten: –strcmp(a, b) ist negativ, wenn a kleiner als b ist, –strcmp(a, b) ist Null, wenn a gleich b ist, –strcmp(a, b) ist positiv, wenn a größer als b ist,

22 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Vergleich von Zeichenketten int strcmp (char *s, char *t) { for (;*s == *t; s++, t++) if (*s == '\0') return(0); return (*s - *t); } Die Zeichenketten werden durchlaufen, solange sie identische Zeichen haben tritt dabei das Ende einer Kette auf, sind sie identisch sonst wird die Differenz berechnet

23 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Vergleich von Zeichenketten Version mit Feldern int strcmp (char s[], char t[]) { int i = 0; while (s[i] == t[i]) if (s[i++] == '\0') return (0); return (s[i] - t[i]); } Felder und Zeiger Noch n Beispiel:

25 Kap 5: ZeigerVorl EINI-I"Prof. Dr. G. Dittrich Mehrdimensionale Felder In C++ sind mehrdimensionale Felder möglich (Details später). Beispiel: int matrix [3][7] –beschreibt eine Matrix mit drei Zeilen und sieben Spalten, deren Elemente vom Typ int ist, –Beachte: int matrix [3][7] beschreibt 7 Elemente vom Typ int matrix [3]. –int matrix [3, 7] ist syntaktisch nicht legal.


Herunterladen ppt "EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido"

Ähnliche Präsentationen


Google-Anzeigen