Linux-C-Programmierlehrgang Teil 10 – Variablenbereiche

Wenn Sie unsere C-Programmier-Tutorialreihe verfolgen, sollten Sie das Konzept der Variablen kennen. Während wir die Grundlagen der Variablen diskutiert haben, gibt es einen weiteren wichtigen Aspekt, der mit den Variablen zusammenhängt und den wir hier diskutieren werden: den Umfang der Variablen.

Beginnen wir mit dem Code für das Austauschen von Werten, den wir in einem unserer früheren Tutorials verwendet haben:

#include <stdio.h>
void swap (int val1, int val2)
{
int temp = 0;

temp = val1;
val1 = val2;
val2 = temp;

printf("\nSwapped values are: %d and %d", val1,val2);

}

int main()
{
int a=0, b=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(a,b);

return 0;
}

Hier in diesem Teil des Codes haben die Variablen ‚val1‘ und ‚val2′ eine lokale Reichweite, was bedeutet, dass sie zum Leben erwachen, wenn die Funktion ’swap‘ aufgerufen wird, und dass sie sterben, sobald der Aufruf zu ’swap‘ beendet ist. Sie können einfach nicht auf ‚val1‘ und ‚val2′ vor oder nach dem Aufruf der Funktion ’swap‘ zugreifen. In ähnlicher Weise ist der Anwendungsbereich der Variablen ‚a‘ und ‚b‘ ebenfalls lokal – lokal für die Funktion ‚main‘.

Beachten Sie, dass diese lokalen Bereichsvariablen auch als automatische Variablen bekannt sind.

Nun, während Variablen mit lokalem Geltungsbereich auf den Block beschränkt sind, in dem sie deklariert sind, gibt es einen anderen Typ von Variablen, deren Geltungsbereich global ist. Wie der Name schon sagt, können globale Bereichsvariablen funktionsübergreifend verwendet werden. Zum Beispiel ist die Variable ‚var‘ eine globale ganzzahlige Variable und kann sowohl in ‚main‘- als auch in ’swap‘-Funktionen verwendet werden.

#include <stdio.h>
int var;

void swap (int val1, int val2)
{
int temp = 0;

temp = val1;
val1 = val2;
val2 = temp;

printf("\nSwapped values are: %d and %d", val1,val2);

}

int main()
{
int a=0, b=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(a,b);

return 0;
}

Standardmäßig wird globalen Variablen der Wert ‚0‘ zugewiesen. Aber das ist bei lokalen Variablen nicht der Fall – man muss ihnen bei ihrer Definition einen Wert zuweisen, sonst enthalten sie einen Müllwert. Zum Beispiel im folgenden Programm:

#include <stdio.h>
int var;

int main()
{
int a;

printf("Local variable 'a' currently holds: %d", a);

printf("\n Global variable var currently holds: %d", var);

return 0;
}

Die Wahrscheinlichkeit, dass Sie einen Nicht-Null-Wert für ‚a‘ erhalten, ist hoch. ‚var‘ hingegen wird am Anfang immer Null sein.

Kann es globale und lokale Variablen gleichen Namens geben? Nun, die Antwort ist ja. Ok, was wird dann das folgende Stück Code in der Ausgabe erzeugen:

#include <stdio.h>
int var = 5;

int main()
{
int var = 10;

printf("Local variable 'a' currently holds: %d", var);

printf("\n Global variable var currently holds: %d", var);

return 0;
}

Nun, die Ausgabe wird in beiden Fällen ’10‘ sein. Der Grund dafür ist, dass die lokale Variable ‚var‘ die globale Variable ‚var‘ überschreibt. Die nächste logische Frage ist nun, wie man in diesem Fall auf die globale ‚var‘ innerhalb von ‚main‘ zugreifen kann. Leider lautet die Antwort NEIN. Tatsächlich sollten Sie es vermeiden, in solche Situationen zu geraten, wenn Sie mit der Sprache C arbeiten.

Als nächstes kommt das Konzept der „externen“ Variablen. Laienhaft ausgedrückt: Wenn Sie das Schlüsselwort ‚extern‘ bei einer Variablen-Deklaration verwenden, sagen Sie dem Compiler, dass diese Variable bereits an anderer Stelle deklariert/definiert ist und wir sie hier nur verwenden. Beispielsweise weiß der Compiler in dem folgenden Code-Stück nicht, dass ‚var‘ existiert, wenn er versucht, die printf-Anweisung innerhalb der Hauptfunktion zu kompilieren.

#include <stdio.h>
int main()
{

printf("\n Global variable var currently holds: %d", var);

return 0;
}

int var = 5;

Deshalb erhalten Sie beim Kompilieren einen Fehler wie den folgenden:

main.c: In function ‘main’:
main.c:14:58: error: ‘var’ undeclared (first use in this function)
 printf("\n Global variable var currently holds: %d", var);
 ^
main.c:14:58: note: each undeclared identifier is reported only once for each function it appears in

Aber wenn Sie hier ‚var‘ als extern deklarieren, werden Sie sehen, dass alles gut funktioniert. Das liegt daran, dass der Compiler schließlich zur ursprünglichen ‚var‘-Deklaration gelangt.

#include <stdio.h>
int main()
{
extern int var;

printf("\n Global variable var currently holds: %d", var);

return 0;
}

int var = 5;

Und Sie erhalten die korrekte Ausgabe:

Global variable var currently holds: 5

So funktioniert also Externes. Externe Variablen werden oft verwendet, wenn Ihr Programm/Projekt auf mehrere Quellcode-Dateien aufgeteilt ist und Sie z.B. in ‚file1‘ eine in ‚file2′ definierte Variable verwenden wollen.

Und schließlich, da wir über variable Bereiche diskutieren, wäre es besser, wenn wir auch hier ’statische‘ Variablen diskutieren würden. Statische Variablen sind insofern etwas Besonderes, als sie auch nach dem Verlassen des Geltungsbereichs ihren Wert behalten. Das bedeutet, dass sie nur einmal initialisiert werden, was das erste Mal ist.

static int counter

Es folgt ein Stück Code, das eine statische Variable verwendet, um die Anzahl der Funktionsaufrufe zu zählen.

#include <stdio.h>
int swap (int val1, int val2)
{
static int counter = 1;
int temp = 0;

temp = val1;
val1 = val2;
val2 = temp;

printf("\n Function called %d times\n", counter);
counter++;
}

int main()
{
int a=9, b=4;

swap(a,b);
swap(a,b);
swap(a,b);

return 0;
}

Hier ist die Ausgabe:

 Function called 1 times
Function called 2 times

Function called 3 times

Sie sehen also, dass die Variable ‚counter‘ auch nach dem Verlassen des Geltungsbereichs ihren Wert behält. Genau wie globale Variablen haben auch statische Variablen einen Standardwert von ‚0‘.

Schlussfolgerung

In diesem Tutorial haben wir mehrere wichtige Konzepte besprochen, die sich alle auf den Umfang von Variablen in der Programmiersprache C beziehen. Vergessen Sie nicht, Ihre eigenen Programme zu erstellen, um den Unterschied zwischen externen, statischen, globalen und lokalen Variablen besser zu verstehen. Und wie immer können Sie im Zweifelsfall oder bei Rückfragen unten einen Kommentar eintragen.

Das könnte dich auch interessieren …