lokale Variablen Variablen bisher nur am Anfang von Funktionen auch erlaubt: am Anfang innerer Codeblöcke (innerhalb geschweifter Klammern) in C99 und als gcc-erweiterung: an beliebiger Stelle innerhalb einer Funktion
Sichtbarkeit und Lebensdauer von lokalen Variablen lokale Variablen können benutzt werden von Punkt ihrer Deklaration an bis zum Ende des Blocks, in dem sie deklariert wurden lokale Variablen existieren, bis der Block, in dem sie deklariert wurden, verlassen wird im Falle eines rekursiven Funktionsaufrufes existieren sie mehrmals, nur die aktuell gültigen können verändert werden
so nicht! int *somevector( void ) int v[10]; /* irgendwas mit v */ return v; /* falsch! */ Nach dem Verlassen der Funktion ist der für v angelegte Speicher wieder freigegeben und wird anderweitig benutzt. Hier muss malloc o.ä. verwendet werden.
Variablen können auch außerhalb von Funktionen (deshalb auch: externe Variablen) deklariert werden. Für diese gilt: Sie sind global sichtbar (in jeder Funktion sichtbar, sofern dort nicht eine Variable mit demselben Namen deklariert wird, wodurch die globale Variable überdeckt wird) Sie existieren während des gesamten Programmablaufes genau einmal falls keine andere Definition stattfindet, erhalten sie den Anfangswert Null
Gegenüberstellung /* lokal */ void inc(int *c) (*c)++; int main( void ) int a=0; inc(&a); /* global */ int a; void inc(void) a++; int main(void) inc();
Gegenüberstellung /* lokal */ void inc(int *c) (*c)++; int main( void ) int a=0; inc(&a); /* global */ int a; void inc(void) a++; int main(void) inc();
Globale Sichtbarkeit - Segen und Fluch vereinfachen Funktionsaufrufe, da sie dort nicht mit angegeben werden müssen. Andrerseits wird der Datenfluss verdeckt, da man dem Funktionsaufruf nicht mehr ansieht, dass ein Wert verändert werden kann. Zudem sind Funktionen, die mit globalen Variablen arbeiten, weniger flexibel. sollten sparsam eingesetzt werden. Sinnvoll sind sie vor allem für Daten, mit denen das ganze Programm arbeiten muss.
Statische Variablen Einen Kompromiss stellen statische Variablen dar. Sie werden innerhalb einer Funktion mit dem Schlüsselwort static definiert. Ihre Sichtbarkeit ist wie die von lokalen Variablen, ihre Lebensdauer und Initialisierung wie die von globalen Variablen. Eine Funktion, die zurückgibt, wie oft sie aufgerufen wurde: /* global */ int counter; int count( void ) return ++counter; /* statisch */ int count( void ) static int counter; return ++counter;
Statische Variablen Einen Kompromiss stellen statische Variablen dar. Sie werden innerhalb einer Funktion mit dem Schlüsselwort static definiert. Ihre Sichtbarkeit ist wie die von lokalen Variablen, ihre Lebensdauer und Initialisierung wie die von globalen Variablen. Eine Funktion, die zurückgibt, wie oft sie aufgerufen wurde: /* global */ int counter; int count( void ) return ++counter; /* statisch */ int count( void ) static int counter; return ++counter;
Statische Variablen Einen Kompromiss stellen statische Variablen dar. Sie werden innerhalb einer Funktion mit dem Schlüsselwort static definiert. Ihre Sichtbarkeit ist wie die von lokalen Variablen, ihre Lebensdauer und Initialisierung wie die von globalen Variablen. Eine Funktion, die zurückgibt, wie oft sie aufgerufen wurde: /* global */ int counter; int count( void ) return ++counter; /* statisch */ int count( void ) static int counter; return ++counter;
Makros als Konstanten Leere Anweisung Konstanten Anstatt eine Zahl mehrere Male im Programm stehen zu haben, ist es sinnvoller, dafür einmal eine Konstante zu definieren. Eine Möglichkeit dafür sind Makros. #define SIZE 10 int a[10]; for(i=0; i<10; i++) int a[size]; for(i=0; i<size; i++)
Makros als Konstanten Leere Anweisung Konstanten Anstatt eine Zahl mehrere Male im Programm stehen zu haben, ist es sinnvoller, dafür einmal eine Konstante zu definieren. Eine Möglichkeit dafür sind Makros. #define SIZE 10 int a[10]; for(i=0; i<10; i++) int a[size]; for(i=0; i<size; i++)
Makros als Konstanten Leere Anweisung Hinweise zu Makros für Konstanten Syntax: #define <Name> <Wert> Konvention: Name in Großbuchstaben Kein Semikolon am Ende auch sinnvoll, wenn die Konstante nur einmal im Programm auftaucht (Auch EOF und NULL sind als Makros definiert.)
Makros als Konstanten Leere Anweisung Leere Anweisung Gelegentlich braucht man, um den Syntaxregeln von C zu entsprechen, eine Anweisung, wo man gar nichts machen will. Dann kann man die leere Anweisung benutzen. Sie besteht einfach nur aus einem Semikolon. Es wird meist in einer eigenen Zeile geschrieben. while (s[len]!= \0 ) len++; while (s[len++]!= \0 ) ;
Makros als Konstanten Leere Anweisung Leere Anweisung Gelegentlich braucht man, um den Syntaxregeln von C zu entsprechen, eine Anweisung, wo man gar nichts machen will. Dann kann man die leere Anweisung benutzen. Sie besteht einfach nur aus einem Semikolon. Es wird meist in einer eigenen Zeile geschrieben. while (s[len]!= \0 ) len++; while (s[len++]!= \0 ) ;