czwartek, 26 kwietnia 2018

Język C - Klasy pamięci

C - Klasy pamięci

Klasa pamięci określa zakres (widoczność) i czas życia zmiennych i/lub funkcji w programie C. Poprzedzają typ, który modyfikują. Mamy cztery różne klasy przechowywania w programie C:
  • auto
  • register
  • static
  • extern

Klasa automatycznej pamięci masowej

Auto klasa pamięci jest domyślną klasą do przechowywania wszystkich zmiennych lokalnych.
{
   int miesiac;
   auto int miesiac;
}
Powyższy przykład definiuje dwie zmienne za pomocą tej samej klasy pamięci. "auto" może być używane tylko w ramach funkcji, tj. zmiennych lokalnych.

Register klasa pamięci

Register klasa służy do definiowania zmiennych lokalnych, które powinny być przechowywane w rejestrze, a nie w pamięci RAM. Oznacza to, że zmienna ma maksymalny rozmiar równy wielkości rejestru (zwykle jedno słowo) i nie może mieć zastosowanego dla niej jednoargumentowego operatora "&" (ponieważ nie ma on lokalizacji w pamięci).
{
   register int  kilometry;
}
Rejestr powinien być używany tylko w przypadku zmiennych wymagających szybkiego dostępu, takich jak liczniki. Należy również zauważyć, że zdefiniowanie "rejestru" nie oznacza, że ​​zmienna będzie przechowywana w rejestrze. Oznacza to, że MOGĄ być przechowywane w rejestrze w zależności od ograniczeń sprzętowych i implementacyjnych.

Static klasa pamięci

Static klasa instruje kompilator, aby utrzymać zmienną lokalną w czasie istnienia życia w czasie programu, zamiast tworzenia i niszczenia go za każdym razem, gdy przychodzi do i wykracza poza zakres. Dlatego ustawienie zmiennych lokalnych na statyczne pozwala im zachować swoje wartości między wywołaniami funkcji.
Modyfikator statyczny można również zastosować do zmiennych globalnych. Gdy to zrobimy, powodujemy, że zakres zmiennej zostanie ograniczony do pliku, w którym jest zadeklarowana.
W programowaniu C, gdy static jest używana w zmiennej globalnej, powoduje, że tylko jedna kopia tego elementu jest współdzielona przez wszystkie obiekty jej klasy.

#include <stdio.h>

/* function declaration */
void funk(void);

static int ile = 5; /* zmienna globalna */

main() {

   while(ile--) {
      funk();
   }

   return 0;
}

/* definicja funkcji */
void funk( void ) {

   static int i = 5; /* static lokalna zmienna */
   i++;

   printf("i to %d i ilość to %d\n", i, ile);
}
Gdy powyższy kod zostanie skompilowany i wykonany, generuje następujący wynik:
i to 6 i ilość to 4
i to 7 i ilość to 3
i to 8 i ilość to 2
i to 9 i ilość to 1
i to 10 i ilość to 0

extern klasa pamięci

Extern klasa służy do podania odniesienia do referencji zmiennej globalnej, która jest widoczna dla wszystkich plików programu. Gdy używasz "extern", zmienna nie może zostać zainicjalizowana, ale wskazuje nazwę zmiennej w miejscu przechowywania, które zostało wcześniej zdefiniowane.
Gdy masz wiele plików i definiujesz zmienną globalną lub funkcję, która będzie również używana w innych plikach, to plik zewnętrzny będzie użyty w innym pliku, aby zapewnić odniesienie do zdefiniowanej zmiennej lub funkcji. Tylko dla zrozumienia, extern służy do zadeklarowania zmiennej globalnej lub funkcji w innym pliku.
Modyfikator zewnętrzny jest najczęściej używany, gdy istnieją dwa lub więcej plików współdzielących te same zmienne globalne lub funkcje, jak wyjaśniono poniżej.
Pierwszy plik: main.c
#include <stdio.h>
int ile ;
extern void zapis_extern();

main() {
   ile = 5;
   zapis_extern();
}
Drugi plik: wsparcie.c
#include <stdio.h>

extern int ile;

void zapis_extern(void) {
   printf("ile wynosi %d\n", ile);
}
Tutaj, extern jest używany do deklarowania zmiennej ile w drugim pliku, gdzie ma swoją definicję w pierwszym pliku, main.c. Teraz skompiluj te dwa pliki w następujący sposób:
$gcc main.c wsparcie.c
Wyprowadzi on program wykonywalny a.out. Po uruchomieniu tego programu wygeneruje się następujący wynik -
Ile wynosi 5


Poprzednia strona                                                          Następna strona


Brak komentarzy:

Prześlij komentarz