2012-03-06 13 views
5

Mam tutaj przykład kodu.Jaka jest różnica między statyczną strukturą a normalną strukturą?

struct node { 
     int data; 
     struct node *link; 
    }; 
    static struct node *first = NULL; 

Byłoby wspaniale, gdyby ktoś mógł rzucić nieco światła na moje poniższe pytania dotyczące użycia słowa static.

  1. Co robi słowo kluczowe static w powyższym kodzie?

  2. Jaka jest różnica między normalną strukturą a statyczną strukturą?

+2

W twoim kodzie nie ma "statycznej struktury". Jest to po prostu "statyczna" instancja 'węzła struktury '. – iammilind

+0

@iammilind: to nawet nie to, że jest instancją 'struct node *'. –

Odpowiedz

7

Tworzy statyczny wskaźnik do node i inicjuje go do NULL.

zmiennej Definicja ta może mieć wiele znaczeń:

static struct node *first = NULL; 

Jeżeli zdefiniowana poza metody daje firstwewnętrzny łącznik. Można go używać tylko w module definiującym.

Ale można też znaleźć tę linię wewnątrz metoda:

void foo() 
{ 
    static struct node *first = NULL; 
} 

Zmienna jest zmienną o zasięgu metoda zamieszkały w pamięci statycznej. Zostaje on zainicjowany na NULL jeden raz i wszystkie kolejne zmiany utrzymują się między wywołaniami funkcji.

+0

To było pytanie: co oznacza "wskaźnik statyczny"? –

+0

@KonradRudolph tak, błędnie przeczytałem pytanie. Edytowane teraz. –

+1

Ten drugi przypadek nazywa się zmienną z "zakresem funkcji i statycznym czasem przechowywania", a nie "metodą globalną". –

5

Oznacza to, że tej zmiennej nie można używać poza tym modułem.

E.g. - nie można odwoływać się do tego wskaźnika z innego pliku przy użyciu

extern struct node *first; 

Ważna uwaga jest taka, że ​​struktura nie jest statyczna, tylko first który jest wskaźnikiem do takiej struktury jest statyczny.

+0

Może to być również zmienna statyczna wewnątrz metody. –

+0

@LuchianGrigore - prawda, nie wziął tego pod uwagę. – MByD

2

Nie ma wpływu na definicję samej struktury. Oznacza to tylko, że konkretna instancja struktury o nazwie first ma wewnętrzne połączenie.

+0

Nie masz na myśli wewnętrznego powiązania? –

+0

Dlaczego tak, tak. :) –

0

Statyczne słowo kluczowe dla zmiennej globalnej powoduje, że zmienna jest lokalna dla modułu, w którym została zdefiniowana. To znaczy. nie można uzyskać do niego dostępu z innego modułu.

Jeśli zmienna statyczna jest zdefiniowana w funkcji, utrzymuje zmienną i aktualizuje się między wywołaniami tej funkcji

0

Podczas modyfikowania zmiennej słowo kluczowe static określa, że ​​zmienna ma czas trwania statyczny (jest przydzielany, gdy program się uruchamia i zwalnia, gdy program się kończy) i inicjalizuje go na 0, chyba że podano inną wartość. Podczas modyfikowania zmiennej lub funkcji w zasięgu pliku słowo kluczowe static określa, że ​​zmienna lub funkcja ma wewnętrzne powiązanie (jej nazwa nie jest widoczna spoza pliku, w którym jest zadeklarowana).

Zmienna deklarowana statycznie w funkcji zachowuje swój stan między wywołaniami tej funkcji.

Podczas modyfikowania elementu danych w deklaracji klasy słowo kluczowe static określa, że ​​jedna kopia elementu jest współużytkowana przez wszystkie wystąpienia klasy. Podczas modyfikowania funkcji składowej w deklaracji klasy słowo kluczowe static określa, że ​​funkcja uzyskuje dostęp tylko do elementów statycznych.

Statyczne elementy danych klas muszą być inicjowane w zakresie pliku.

W kodzie rekursywnym, statyczny obiekt lub zmienna ma zagwarantowany ten sam stan w różnych instancjach bloku kodu.

Członków unii nie można zadeklarować jako statycznych. Deklarowany globalnie anonimowy związek musi być jawnie uznany za statyczny.

Obiekty i zmienne zdefiniowane poza wszystkimi blokami mają domyślnie ustawiony czas życia i powiązanie zewnętrzne. Obiekt globalny lub zmienna jawnie zadeklarowana jako statyczna ma powiązanie wewnętrzne.

+1

** Statyczny nie oznacza tego. ** W rzeczywistości jest przydzielany w pamięci statycznej, a nie na stercie lub stosie. –

Powiązane problemy