Speicherklassen (1) Lokale Variablen • •

Lokale Variablen beschränken sich auf die Funktionen, in denen sie definiert werden Sind in der Funktion gekapselt – können also nur in der Funktion verändert werden – Sind nur in dieser Funktion sichtbar long Fakultaet(long a) { long f = 1; for (; a > 1; a = a - 1) f = f * a; return f; } // end Fakultaet

• • •

Funktion berechnet Fakultät 𝑎! einer Zahl 𝑎 > 0 Variable a ist Parameter der Funktion, f ist zur Berechnung des Ergebnisses Beide gelten nur in der Funktion Fakultaet, sie sind deshalb lokale variablen in dieser Funktion

Vorlesung Informatik 1, WS 2016

T. Ihme

Speicherklassen (2) Blockstruktur von C • • • •

• • •

• •

Lokale Variablen müssen zu Beginn der Funktion definiert werden (im Gegensatz zu C++) Übersichtlich, da alle Variablen Am Funktionsanfang zu finden sind Nachteil ist, dass man manchmal variablen definiert, die später nicht genutzt werden Wird Funktion rechts eine negative Zahl übergeben, gibt sie eine 0 long Fakultaet(long a) als Fehlererkennung zurück { long f = 1; In dem Fall wird Variable f nicht benutzt if (a < 0) Lösungsmöglichkeit: Blöcke { printf ("Fehler!"); Block ist ein in geschweiften Klammern return 0; eingefasster Programmbereich (wie } Funktionsrumpf) for (; a > 1; a = a - 1) Variablendefinitionen müssen zu Beginn f = f * a; eines Blockes stehen return f; } // end Fakultaet Nicht empfohlen: Definition von Variablen zu Beginn eines Schleifenblocks, da diese bei jedem Durchlauf neu angelegt werden

Vorlesung Informatik 1, WS 2016

T. Ihme

Speicherklassen (3) Blockstruktur von C •

Lösungsmöglichkeit mit Hilfe eines Blocks: long Fakultaet(long a) { if (a < 0) // Fehlerbehandlung { printf ("Fehler!"); return 0; } { long f = 1; // Var. f wird erst hier angelegt for (; a > 1; a = a - 1) f = f * a; return f; } } // end Fakultaet

Vorlesung Informatik 1, WS 2016

T. Ihme

Speicherklassen (4) Blockstruktur von C •

Sonderfall: Variablen mit gleichem Namen verdecken Variablen aus äußeren Blöcken main() { long a = 1; { long a = 2; printf("a = %ld\n", a); } { printf("a = %ld\n", a); } } // end main

• •

A im inneren Block verdeckt a im äußeren Block  erste Ausgabe „2“, zweite Ausgabe „1“ Fazit: gleichlautende Variablen vermeiden, nach Möglichkeit für ganze Funktion definieren

Vorlesung Informatik 1, WS 2016

T. Ihme

Speicherklassen (5) Lokale Variablen der Speicherklasse auto • •



Liegt kein spezielles Schlüsselwort wie register oder static vor, sind lokale Variablen automatische Variablen Automatisch bedeutet, dass sie am Blockanfang automatisch für den Block angelegt und am Blockende automatisch wieder gelöscht werden  Speicher wird automatisch angelegt und wieder freigegeben Alle bisher verwendeten Variablen sind automatische Variablen

Vorlesung Informatik 1, WS 2016

T. Ihme

Speicherklassen (6) Lokale Variablen der Speicherklasse register • • • •

Dient der Beschleunigung von Variablenzugriffen bei häufig genutzten Variablen Wichtig beispielsweise für Schleifenvariablen Für diese Variablen wird kein Speicher angelegt, stattdessen wird ein Register des Prozessors verwendet Nur möglich für char, long, double, float und Zeiger, nicht jedoch für selbstdefinierte Datentypen double Mittelwert(register double x, register double y) { return (x + y) / 2; } // end Mittelwert

• • •

Wenn keine Register mehr frei  automatische Variablen Optimierer von Compilern setzen häufig gebrauchte Variablen automatisch auf register  Angabe des Schlüsselwortes nur selten notwendig Register haben keine Adresse  Anwendung des Adressoperators nicht möglich

Vorlesung Informatik 1, WS 2016

T. Ihme

Speicherklassen (7) Lokale Variablen der Speicherklasse static • • •

Werden wie automatische Variablen definiert und verwendet Bei Definition wird static vor den Variablentyp geschrieben Existieren, so lange Programm läuft, Sichtbarkeitsbereich ist trotzdem nur lokal  Variable wird bei Einsprung in eine Funktion „sichtbar“ und bei Verlassen der Funktion „unsichtbar“ void AufrufZaehler() { static long aufrufe = 0; aufrufe = aufrufe + 1; printf("Die Funktion wurde %ld mal aufgerufen.\n", aufrufe); } // end AufrufZaehler

• • •

Einmalige Definition und in diesem Beispiel auch Initialisierung ohne Initialisierung erfolgt automatische Initialisierung mit 0  zur Übersicht aber besser, das explizit hinzuschreiben Gute Möglichkeit zur Vermeidung von globalen Variablen

Vorlesung Informatik 1, WS 2016

T. Ihme

Speicherklassen (8) Lokale Variablen - Übersicht Speicherklasse

Merkmale

Gültigkeit

Initialisierung

auto

Ohne Angabe einer Speicherklasse: automatisch Speicherklasse: auto

Variable wird am Ohne Initialisierung ist Blockanfang Wert der Variable nicht erzeugt und am definiert Blockende zerstört

register Wie auto, werden aber in Wie Variablen vom Wie Variablen vom Typ auto Typ auto Registern des Prozessors gespeichert. möglich: char, long, double, Zeiger; Adressoperator nicht möglich static

Wie Variablen vom Typ auto

Vorlesung Informatik 1, WS 2016

Variablen existieren, so lange Programm läuft T. Ihme

Werden zu Beginn einmal initialisiert, ansonsten automatisch mit 0 initialisiert

Speicherklassen (9) Globale Variablen • • •

• •

Werden außerhalb jeder Funktion definiert, jedoch nicht zwangsweise am Dateianfang (Empfehlung: am Dateianfang) Sind während der gesamten Programmlaufzeit sichtbar Globale Variablen werden automatisch mit 0 initialisiert – Übersichtlicher, wenn Initialisierung explizit erfolgt – Mit expliziter Initialisierung wird sichergestellt, dass bei Verschiebung der Variable in eine Funktion die Initialisierung nicht vergessen wird Nachteil: können aus verschiedenen Funktionen heraus verändert werden  schwer festzustellen, von wo aus Zugriff erfolgt Werden viele globale Variablen verwendet, liegt eine Entwurfsschwäche vor

Vorlesung Informatik 1, WS 2016

T. Ihme

Speicherklassen (10) Globale Variablen der Speicherklasse extern • • • •

Globale Variablen ohne Schlüsselwort static sind externe Variable Schlüsselwort extern darf nicht bei Definition angegeben werden Externe globale Variablen sind in der Datei, in der sie definiert werden, ab ihrer Definition sichtbar In anderen Dateien (und vor ihrer Definition) müssen sie per extern deklariert werden // Modul file1.c long oeffentlicheZahl; // Definition von oeffentlicheZahl // ... // Modul file2.c extern long oeffentlicheZahl; // Deklaration // ...

• •

In file1.c wird oeffentlicheZahl definiert (Typ/Name und Speicherplatz) und kann ab der Stelle verwendet werden In file2.c wird oeffentlicheZahl deklariert (nur Typ/Name) und ist dem Compiler ab dieser Stelle bekannt

Vorlesung Informatik 1, WS 2016

T. Ihme

Speicherklassen (11) Globale Variablen der Speicherklasse static •

Soll eine globale Variable nicht exportiert werden, ist sie mit dem Schlüsselwort static zu versehen  nur in dieser Datei sichtbar static long statischeVariable;

Vorlesung Informatik 1, WS 2016

T. Ihme

Speicherklassen (12) Globale Variablen - Übersicht Speicherklasse

Merkmale

Gültigkeit

extern

Angabe von extern nur bei Deklaration nicht jedoch bei Definition, Angabe außerhalb jeder Funktion

In dem Modul, in dem ohne Initialwert wird sie definiert wurden und Variable auf 0 in anderen Modulen, in gesetzt denen sie per extern deklariert wurden

static

Wie Variablen vom Typ extern

Variablen sind ausschließlich in dem Modul sichtbar, in dem sie definiert wurden

Vorlesung Informatik 1, WS 2016

T. Ihme

Initialisierung

Wie Variablen vom Typ extern