Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
c○ Prof. Dr. B. Bartning, HS <strong>Emden</strong>/<strong>Leer</strong> Rumpfskript ” Informatik I/II“ (WS/SS 2010/11) 112<br />
(10.25)<br />
(a)<br />
(b)<br />
Allgemeine Regeln für die Interpretation von Typen bei Deklarationen:<br />
VariablenDefinition [NV] Typ Deklarator [- , Deklarator ]- 0..n ;<br />
Typ (hier) 12 DeklSpezifizierer1..n<br />
30 Deklarator [NV] 32 DirekterDeklarator<br />
|<br />
|<br />
31 - * &<br />
32DirekterDeklarator Bezeichner (d. h. Name)<br />
32DirekterDeklarator[KonstAusdropt] <br />
- 30 Deklarator<br />
|<br />
| ( 30Deklarator ) |<br />
|<br />
• (Ohne Referenz-Deklarationsoperator &:)<br />
Tritt der Deklarator nach dem Deklarationspunkt auf, so ist er vom angegebenen<br />
” Typ“.<br />
• (Bei Vorhandensein des Referenz-Deklarationsoperators &:)<br />
Tritt der Deklarator (OHNE den &-Deklarationsoperators) nach dem Deklarationspunkt<br />
auf, so ist er vom Typ ” Referenz auf Typ“.<br />
Regeln zur Bestimmung des Typs eines Namens innerhalb eines Deklarators:<br />
Je Stufe wird genau einer der Deklarationsoperatoren (* bzw. [ ] [NV] ) weggelassen, und<br />
zwar immer der Operator mit der augenblicklich niedrigsten Bindung. Es gelten dabei folgende<br />
Regeln:<br />
• Ist *A vom Typ ” T“, so ist A vom Typ ” Zeiger auf T“.<br />
• Ist A[KonstAusdropt] vom Typ ” T“, so ist A vom Typ ” Array, bestehend aus Komponenten<br />
des Typs T“ (Anzahl der Komponenten entspr. KonstAusdr; wenn fehlend,<br />
dann unbestimmte Anzahl).<br />
Regel zur Unterscheidung zwischen Typ und Deklarator (zweite Zeile in obigem Kasten):<br />
Man beginne hinten beim Semikolon und finde, falls vorhanden, das vorderste Komma (bis<br />
dahin: nur Deklaratoren). Nun gehe man weiter nach links und suche und überspringe, falls<br />
vorhanden:<br />
• einen Namen (ggf. vorhandene eckige Klammernpaare überspringen),<br />
• dann ein oder mehrere Zeichen * oder & (mit ggf. dazwischenliegenden const’s, s. (10.28)),<br />
• dann, falls runde schließende Klammern übersprungen wurden, die zugehörigen öffnenden<br />
Klammern.<br />
Jetzt ist man an dem Trennpunkt zwischen Typ und Deklarator.<br />
Bei einer Definition wird nicht Speicherplatz für den Deklarator, sondern für den<br />
Namen reseviert.<br />
In ähnlicher Weise wird eine ggf. vorhandene Initialisierung auf den Namen (der den<br />
Speicherplatz erhält) angewendet, nicht auf den Deklarator.<br />
Bsp char *zeig=0; // zeig (d. h. Zeiger auf char) wird initialisiert mit 0, nicht *zeig.<br />
(10.26) Wichtige Regel zum Umgang mit Arrays (Zusammenhang zwischen Array und Zeiger) –<br />
bereits in (5.65b, 7.46 ↑↑) erwähnt:<br />
Ein Arrayname bzw. eine Arraybezeichnung ( ” Array, bestehend aus Elementen des<br />
Typs T“) wird durch den Compiler automatisch umgewandelt in ” Zeiger auf T“, und<br />
zwar die Adresse des ersten Elements (Element mit Index 0).<br />
Implizit wird demnach ArrayBezeichnung umgewandelt in &ArrayBezeichnung[0]<br />
Insbesondere findet diese Umwandlung immer bei formalen und bei aktuellen Funktionsparametern<br />
statt.<br />
Die (wesentlichen) Ausnahmen von obiger Regel sind: