In der C-Sprache kann die wörtliche Bedeutung von static leicht in die Irre führen; tatsächlich hat es drei Rollen.
(1) Zuerst stellen wir seine erste und wichtigste Rolle vor: das Verbergen.
Wenn wir mehrere Dateien gleichzeitig kompilieren, haben alle globalen Variablen und Funktionen ohne das static-Präfix globale Sichtbarkeit. Um diese Aussage zu verstehen, lassen Sie mich ein Beispiel geben. Wir müssen zwei Quelldateien gleichzeitig kompilieren: eine ist a.c und die andere ist main.c.
Das Folgende ist der Inhalt von a.c:
Code der Datei a.c
void msg()
{
printf("Hello\n");
}
Das Folgende ist der Inhalt von main.c:
Code der Datei main.c
{
extern char a; // Externe Variable muss vor der Verwendung deklariert werden
printf("%c ", a);
(void)msg();
return 0;
}
Die Programmausgabe lautet:
A Hello
Sie fragen sich vielleicht: Warum können die globale Variable a und die Funktion msg, die in a.c definiert sind, in main.c verwendet werden? Wie bereits erwähnt, haben alle globalen Variablen und Funktionen ohne das static-Präfix globale Sichtbarkeit, und andere Quelldateien können ebenfalls darauf zugreifen. In diesem Beispiel ist a eine globale Variable und msg eine Funktion, und keine von beiden hat das static-Präfix, daher sind sie für die andere Quelldatei main.c sichtbar.
Wenn static hinzugefügt wird, werden sie vor anderen Quelldateien verborgen. Wenn beispielsweise static vor den Definitionen von a und msg hinzugefügt wird, sieht main.c sie nicht. Mit dieser Funktion können wir Funktionen und Variablen mit demselben Namen in verschiedenen Dateien definieren, ohne uns um Namenskonflikte sorgen zu müssen. static kann als Präfix für Funktionen und Variablen verwendet werden. Bei Funktionen beschränkt sich die Wirkung von static auf das Verbergen, während static bei Variablen die folgenden zwei zusätzlichen Rollen hat.
(2) Die zweite Rolle von static besteht darin, die Persistenz des Variableninhalts aufrechtzuerhalten.
Variablen, die im statischen Datenbereich gespeichert sind, werden initialisiert, wenn das Programm zum ersten Mal ausgeführt wird, und dies ist die einzige Initialisierung. Es gibt zwei Arten von Variablen, die im statischen Speicherbereich gespeichert werden: globale Variablen und statische Variablen. Im Vergleich zu globalen Variablen kann static jedoch den Sichtbarkeitsbereich von Variablen steuern. Letztendlich wird static immer noch zum Verbergen verwendet. Obwohl diese Verwendung nicht üblich ist, gebe ich trotzdem ein Beispiel.
Beispiel
int fun(void){
static int count = 10; // Tatsächlich wurde diese Zuweisungsanweisung nie ausgeführt.
return count--;
}
int count = 1;
int main(void)
{
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
}
Die Programmausgabe lautet:
global local static 1 10 2 9 3 8 4 7 5 6 6 5 7 4 8 3 9 2 10 1
(3) Die dritte Rolle von static besteht darin, standardmäßig auf 0 zu initialisieren.
Tatsächlich haben auch globale Variablen diese Eigenschaft, weil globale Variablen ebenfalls im statischen Datenbereich gespeichert werden. Im statischen Datenbereich ist der Standardwert jedes Bytes im Speicher 0,0x00und manchmal kann diese Eigenschaft die Arbeitslast des Programmierers verringern. Zum Beispiel können wir beim Initialisieren einer dünn besetzten Matrix alle Elemente einzeln auf 0 setzen,0und dann die wenigen Elemente zuweisen, die nicht 0 sind.0Wenn als static definiert, entfällt die anfängliche Operation des Auf-0-Setzens. Ein weiteres Beispiel: Wenn wir ein Zeichenarray als String verwenden möchten, aber es als lästig empfinden, jedes Mal am Ende des Zeichenarrays00 hinzuzufügen.\0Wenn die Zeichenkette als static definiert wird, entfällt diese Mühe, weil dort bereits 0 steht.\0 。
Lasst uns ein kleines Experiment durchführen, um dies zu verifizieren.
Beispiel
int a;
int main(void)
{
int i;
static char str[10];
printf("integer: %d; string: (begin)%s(end)", a, str);
return 0;
}
Die Programmausgabe sieht wie folgt aus:
integer: 0; string: (begin)(end)
Fassen wir abschließend die drei Rollen von static in einem Satz zusammen. Erstens, die wichtigste Funktion von static ist das Verbergen; zweitens, weil static-Variablen im statischen Speicherbereich gespeichert werden, besitzen sie Persistenz und einen Standardwert von 0.
Quelle: https://www.cnblogs.com/dc10101/archive/2007/08/22/865556.html