|
char | Character, ASCII-Zeichen; Konstanten werden in single quotes eingeschlossen, z. B. 'c'; formal: Integer mit kleinem Wertebereich; (= 1 Byte) | int | Integer; ganze Zahl, typischerweisevon der Länge eines Maschinenwortes; (2 Byte) | float | Fließkommazahl (einfach genau); (4 Byte) | double | Fließkommazahl (doppelt genau); (8 Byte) | void | leer (vor allem bei Zeigern und Funktionen wichtig); |
Speicherklassen
auto | "normale" lokale Variable (Standard-(default-)Speicherklasse,zufällig initialisiert)
- alle Variablen, denen nicht explizit eine Speicherklasse zugewiesen
wird und die nicht außerhalb von Funktionen vereinbart werden,
fallen in die Speicherklasse auto
- man kann einer Variablen explizit die Speicherklasse auto
zuordnen, indem man vor die Typangabe bei der Variablenvereinbarung
das Schlüsselwort auto setzt
- automatische Variable werden bei jedem Funktionsaufruf neu erzeugt
und beim Verlassen der Funktion wieder zerstört
- daher ist ihr Geltungsbereich auf die lokale Funktion, in der
sie vereinbart wurden, beschränkt
- dies gilt auch für Blöcke (Variablen, die innerhalb
von Blöcken vereinbart werden und die in die Speicherklasse
auto fallen, sind nur lokal in diesem Block bekannt)
- auto Variablen können beliebig (nicht nur mit Konstanten)
initialisiert werden
- nicht initialisierte auto Variablen haben einen undefinierten
Wert (es existiert kein Weglasswert!)
- auto Vektoren können nicht initialisiert
werden
Beispiele:
int y = 1; /* global */
int main(void)
{
int x = 5; /* lokal */
printf("x=%d\n",x); /* Ausgabe: 5 */
{
int x=10;
printf("x=%d\n",x); /* Ausgabe: 10 */
}
printf("x=%d\n",x); /* Ausgabe: 5 */
}
Das folgende Programm erzeugt einen Compilerfehler: "x nicht definiert".
Da x nicht global ist, kann print() nicht darauf zugreifen.
void print(void);
int main(void)
{
int x=5;
print();
}
void print(void)
{
printf("x=%d\n",x);
}
|
register
| der "Wunsch", char- oder int-Variable
im Maschinenregister zu speichern (zufällig initialisiert)
- in dieser Speicherklasse können sich einfache Variable
befinden
- sie entspricht in ihren sonstigen Eigenschaften der Speicherklasse
auto
- der Compiler versucht register Variablen so zu verwenden,
daß sie in einem wirklichen Hardwareregister der CPU gehalten
werden
- ist dies nicht möglich, so wird register ignoriert
und die Variable wie auto behandelt
|
extern
| lokale Deklaration von globalen Variablen (initialisiert mit 0)
Beispiel: Text einlesen und die Häufigkeit der Zeichen zählen
#include <stdio.h>
#define MAXCHARS 255
int count[MAXCHARS]; /* global */
void print_alle (void);
void main(void)
{
extern int count[]; /* Deklaration von count */
int c;
while((c=getchar()) != EOF)
count[(char) c]++ ;
print_alle();
}
void print_alle(void) /* kann z. B. in einer anderen Datei stehen */
{
extern int count[]; /* Deklaration von count */
int i;
for(i = 0; i < MAXCHARS; i++)
printf("%d: %d\n",i,count[i]);
}
|
static
| "statische" Variable, Inhalt bleibt erhalten (initialisiert mit 0)
- static Objekte können sowohl intern als auch extern sein
- static Objekte innerhalb von Funktionen sind nur lokal
bekannt, behalten im Gegensatz zu auto Objekten aber ihre
Werte zwischen den Funktionsaufrufen bei
- bzgl. der Initialisierung gilt dasselbe wie für externe
Objekte, static Vektoren sind daher initialisierbar
- Zeichenketten innerhalb von Funktionen sind immer in der Speicherklasse
static (z.B. printf() Parameterstring)
- static Objekte außerhalb von Funktionen sind externe
Objekte, deren Namen aber nur in dieser Quellencodedatei bekannt ist
- Beispiele zur Initialisierung eines Vektors:
static int ndigit[10] = { 0,1,2,3,4,5,6,7,8,9 };
char string[] = "Dies ist ein String";
Beispiel: Zwischenspeicherung von Werten in einer Funktion
#include <stdio.h>
char *monatsname(int); /* Gibt Zeiger auf ein Feld zurueck */
int main(void)
{
int i;
for(i = 1; i <= 12; i++)
printf("%s\n",monatsname(i));
}
char *monatsname(int n)
{
static char *name[] = {"falscher Monat",
"Januar",
"Februar",
"Maerz",
"April",
"Mai",
"Juni",
"Juli",
"August",
"September",
"Oktober",
"November",
"Dezember"
};
if ((n < 1) || (n > 12))
return(name[0];
else
return(name[n]);
}
|
Qualifizierer
signed
| vorzeichenbehaftet (default für integer, bei char
implemantationsabhängig; nur für ganzzahlige Datentypen) |
unsigned
| nicht vorzeichenbehaftet (nur für ganzzahlige Datentypen) |
short int
| int mit evtl. kleinerem Wertebereich (2 Byte) |
long int
| int mit evtl. größerem Wertebereich (4 Byte) |
long double
| double mit evtl. größerem Wertebereich |
const
| Variable kann nur gelesen werden (wird u.U. compilerabhängig ignoriert,
allerdings liefert ein Verstoß eine Compiler-Warnungen) |
volatile
| Wert wird möglicherweise durch parallel laufende Prozesse verändert.
Q. verhindert "Wegoptimieren" (kann ebenfalls compilerabhängig
ignoriert werden)
|
Außer eventuell bei char sind diese Größen
nicht festgelegt, sondern abhängig vom jeweiligen Compiler. Definitiv
festgelegt sind die angegebenen Mindestgrößen und die folgenden Relationen:
short <= int <= long;
float <= double <= long double.
Die tatsächliche Größe kann man den Header-files <limits.h>
und <float.h> entnehmen.
|
|
|