Jaka jest różnica między typami danych int i static int w języku C?


Najlepsza odpowiedź

Nie należy mylić typu (np. int) z innymi aspektami deklaracji (np. klasa pamięci, taka jak static).

Tj. w:

int x;

static int y;

x i y mają ten sam typ, int (termin „ typ danych ” jest rzadziej używane w C i C ++; nie jest jednak błędne).

Słowo kluczowe static ma trzy różne znaczenia w C. W powyższym przykładzie oznacza ta zmienna y jest „prywatna” dla tej konkretnej jednostki tłumaczeniowej (ponieważ jednostka tłumaczeniowa może być traktowana jako plik źródłowy po wszystkich dyrektywach #include zostały przetworzone). Zatem zmienna y zadeklarowana w innej jednostce tłumaczeniowej różni się od tej.

Oto przykład drugiego znaczenia static w C:

void f() {

static int n = 2;

...

}

Ta statyczna oznacza, że ​​zmienna n jest współdzielone przez wszystkie wywołania f() i istnieje nawet po f() powrocie (możesz, np. zwróć do niego wskaźnik). Inicjalizacja n do 2 tylko ma miejsce przed uruchomieniem programu w C (na pierwszym wywołaniu f() w C ++). Więc drugi (i późniejszy) czas f() jest wywoływany, n zachowa jakąkolwiek wartość, którą miał wcześniej (dopóki program nie zmodyfikuje jej wyraźnie ).

Trzecie znaczenie jest mniej powszechne (i, jak sądzę, mniej znane):

void g(double x[static 5]) {

...

}

Oznacza to, że g() można wywołać tylko ze wskaźnikiem do pierwszej z co najmniej 5 double wartości w postaci tablicy.

EDYCJA: Naprawiono objaśnienie lokalnych statyczna inicjalizacja jako (patrz komentarz Jesse Pollarda).

Odpowiedź

Statyczny jest przeciwieństwem dynamicznego. Co? Oznacza to, że pamięć przydzielona tej zmiennej nie jest przenoszona w pamięci. Oznacza to również, że w powtarzających się wywołaniach funkcji, które mają dostęp do tej zmiennej, nie są tworzone nowe kopie w tle zmiennej; używana jest oryginalna zmienna, a każda inna funkcja uzyskująca dostęp do tej zmiennej pod tym adresem może ją modyfikować lub odczytywać. Nie jest per se zmienną globalną; jego zakres pozostaje taki sam, jak miejsce i sposób zdefiniowania. Ale może tak być. Jednak próba zdefiniowania innej zmiennej statycznej o tej samej nazwie w tym samym pliku lub w aplikacji byłaby błędem.

rozważ prostą funkcję dodawania w C:

int add(int a, int b)

{

static int count = 0;

static int last = 0;

count++;

last = a + b;

printf( "a:\t\%d \t\t b:\t\%d\n", a, b );

printf( "count:\t\%d \t\t last:\t\%d\n", count, last)

return last;

}

liczba i ostatnia są zdefiniowane jako statyczne. Oznacza to, że wartości umieszczone w nich są zachowywane w wielu wywołaniach dodawania. count i last są inicjowane do zera, ale nie są zerowane ponownie po każdym wywołaniu. Zwróć uwagę, że zakres count i last znajdują się tylko w funkcji add. Nie mogą być współużytkowane z innymi funkcjami lub dostępne poza programem add, więc aby się do nich dostać, musisz je wydrukować z wnętrza funkcji. Inne funkcje również mogą mieć identyczną liczbę i ostatnie zmienne statyczne i nigdy nie będą ze sobą współpracować.

Spójrzmy teraz na ten program testowy:

#include

static int count = 5;

static int last = 0;

int add(int a, int b)

{

static int count = 0;

static int last = 0;

count++;

last = a + b;

printf( "a:\t\%d \t\t b:\t\%d\n", a, b );

printf( "count:\t\%d \t\t last:\t\%d\n", count, last)

return last;

}

int main(int argc, char**argv )

{

static int count = 10;

static int last = 0;

int i;

int a=1, b=1;

for(i = 0 ; i < count ; i++)

{

a = add(a, b);

b = add(a, last);

last = add(a, b);

}

printf( "a:\t\%d \t\t b:\t\%d\n", a, b );

printf( "count:\t\%d \t\t last:\t\%d\n", count, last);

return 0;

}

Trzy to 3 zestawy zmiennych statycznych licznik i ostatni; wszystkie są oddzielne. Najpierw są globale, których nigdy nie używa się tutaj. main ma swój własny zestaw, którego używa, ponieważ jego lokalne zmienne przesłaniają globals. add ma swój własny zestaw, który tworzy cień zarówno main, jak i globals o tej samej nazwie.

Definicje funkcji statycznych to inny rodzaj rzeczy. Słowo static wskazuje, że funkcja jest widoczna tylko w pliku, który jest kompilowany ze źródła, w którym została zdefiniowana. To jest plik źródłowy („.c”) lub nagłówek („.h) zawarty w nim plik. Może to być konieczne, jeśli używane pliki obiektów mają więcej niż jedną wersję funkcji o tej samej nazwie (np. Add, print, error,…), tak aby łączenie plików obiektowych („. O”) razem, ponieważ moduły nie powodują kolizji nazw.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *