Co to jest klasa pamięci w C?
Klasa pamięci reprezentuje widoczność i lokalizację zmiennej. Informuje, z jakiej części kodu możemy uzyskać dostęp do zmiennej. Klasa pamięci w C służy do opisania następujących rzeczy:
- Zakres zmiennej.
- Lokalizacja, w której będzie przechowywana zmienna.
- Zainicjowana wartość zmiennej.
- Czas życia zmiennej.
- Kto ma dostęp do zmiennej?
W ten sposób klasa pamięci jest używana do reprezentowania informacji o zmiennej.
UWAGA: Zmienna jest powiązana nie tylko z typem danych, jego wartością, ale także z klasą pamięci.
Istnieją łącznie cztery typy standardowych klas pamięci. Poniższa tabela przedstawia klasy pamięci w C.
Klasa przechowywania | Cel, powód |
automatyczny | Jest to domyślna klasa pamięci. |
zewnętrzny | To jest zmienna globalna. |
statyczny | Jest to zmienna lokalna, która może zwracać wartość nawet wtedy, gdy sterowanie jest przekazywane do wywołania funkcji. |
zarejestrować | Jest to zmienna przechowywana w rejestrze. |
W tym samouczku w języku C nauczysz się różnych typów klas pamięci masowej w języku C z przykładami:
- Klasa Auto Storage w C.
- Klasa pamięci zewnętrznej w C
- Pierwszy plik: main.c
- Drugi plik: oryginał.c
- Statyczna klasa pamięci w C
- Zarejestruj klasę pamięci w C
Klasa Auto Storage w C.
Zmienne zdefiniowane za pomocą klasy automatycznego przechowywania nazywane są zmiennymi lokalnymi. Auto oznacza klasę automatycznego przechowywania. Zmienna jest domyślnie w klasie automatycznego przechowywania, jeśli nie została wyraźnie określona.
Zakres zmiennej automatycznej jest ograniczony tylko do konkretnego bloku. Gdy kontrola wyjdzie z bloku, dostęp zostaje zniszczony. Oznacza to, że tylko blok, w którym zadeklarowano zmienną automatyczną, ma do niej dostęp.
Do zdefiniowania klasy automatycznego zapisu służy słowo kluczowe auto. Domyślnie zmienna automatyczna zawiera wartość śmieci.
Example, auto int age;
Poniższy program definiuje funkcję z dwiema zmiennymi lokalnymi
int add(void) {int a=13;auto int b=48;return a+b;}
Bierzemy inny program, który pokazuje poziom zakresu „poziom widoczności” dla zmiennych automatycznych w każdym kodzie blokowym, które są od siebie niezależne:
#includeint main( ){auto int j = 1;{auto int j= 2;{auto int j = 3;printf ( " %d ", j);}printf ( "\t %d ",j);}printf( "%d\n", j);}
WYNIK:
3 2 1
Klasa pamięci zewnętrznej w C
Extern oznacza klasę pamięci zewnętrznej. Klasa pamięci zewnętrznej jest używana, gdy mamy globalne funkcje lub zmienne, które są współużytkowane przez dwa lub więcej plików.
Słowo kluczowe extern służy do deklarowania globalnej zmiennej lub funkcji w innym pliku w celu zapewnienia odniesienia do zmiennej lub funkcji, które zostały już zdefiniowane w oryginalnym pliku.
Zmienne zdefiniowane za pomocą słowa kluczowego extern nazywane są zmiennymi globalnymi. Te zmienne są dostępne w całym programie. Zwróć uwagę, że zmiennej extern nie można zainicjować, ponieważ została już zdefiniowana w oryginalnym pliku.
Example, extern void display();
Pierwszy plik: main.c
#includeextern i;main() {printf("value of the external integer is = %d\n", i);return 0;}
Drugi plik: oryginał.c
#includei=48;
Wynik:
value of the external integer is = 48
Aby skompilować i uruchomić powyższy kod, wykonaj poniższe czynności
Krok 1) Utwórz nowy projekt,
- Wybierz aplikację konsolową
- Kliknij Idź
Krok 2) Wybierz C i kliknij Dalej
Krok 3) Kliknij Dalej
Krok 4) Wprowadź szczegóły i kliknij Dalej
Krok 5) Kliknij Zakończ
Krok 6) Umieść główny kod, jak pokazano w poprzednim programie, w pliku main.c i zapisz go
Krok 7) Utwórz nowy plik C [Plik -> nowy -> Pusty plik, zapisz (jako oryginał.c) i dodaj go do bieżącego projektu, klikając "OK" w oknie dialogowym.
Krok 8) Umieść i zapisz kod C z pliku original.c pokazanego w poprzednim przykładzie bez funkcji main ().
Krok 9) Zbuduj i uruchom swój projekt. Wynik przedstawiono na następnym rysunku
Statyczna klasa pamięci w C
Zmienne statyczne są używane w funkcji / pliku jako lokalne zmienne statyczne. Mogą być również używane jako zmienne globalne
- Statyczna zmienna lokalna to zmienna lokalna, która zachowuje i przechowuje swoją wartość między wywołaniami funkcji lub blokiem i pozostaje widoczna tylko dla funkcji lub bloku, w którym jest zdefiniowana.
- Statyczne zmienne globalne to zmienne globalne widoczne tylko dla pliku, w którym są zadeklarowane.
Example: static int count = 10;
Należy pamiętać, że zmienna statyczna ma domyślną wartość początkową zero i jest inicjowana tylko raz w okresie jej istnienia.
#include/* function declaration */void next(void);static int counter = 7; /* global variable */main() {while(counter<10) {next();counter++; }return 0;}void next( void ) { /* function definition */static int iteration = 13; /* local static variable */iteration ++;printf("iteration=%d and counter= %d\n", iteration, counter);}
Wynik:
iteration=14 and counter= 7iteration=15 and counter= 8iteration=16 and counter= 9
Zmienne globalne są dostępne w całym pliku, podczas gdy zmienne statyczne są dostępne tylko dla określonej części kodu.
Żywotność zmiennej statycznej znajduje się w całym kodzie programu. Zmienna zadeklarowana lub zainicjowana przy użyciu słowa kluczowego static zawsze zawiera zero jako wartość domyślną.
Zarejestruj klasę pamięci w C
Możesz użyć klasy pamięci rejestrów, gdy chcesz przechowywać zmienne lokalne w funkcjach lub blokach w rejestrach procesora zamiast w pamięci RAM, aby mieć szybki dostęp do tych zmiennych. Na przykład „liczniki” są dobrym kandydatem do przechowywania w rejestrze.
Example: register int age;
Słowo kluczowe register służy do zadeklarowania klasy pamięci rejestrów. Zmienne zadeklarowane przy użyciu klasy pamięci rejestru mają żywotność w całym programie.
Jest podobny do klasy automatycznego przechowywania. Zmienna jest ograniczona do konkretnego bloku. Jedyną różnicą jest to, że zmienne zadeklarowane przy użyciu klasy pamięci rejestrów są przechowywane w rejestrach procesora zamiast w pamięci. Rejestr ma szybszy dostęp niż pamięć główna.
Zmienne zadeklarowane przy użyciu klasy pamięci rejestru nie mają wartości domyślnej. Te zmienne są często deklarowane na początku programu.
#include/* function declaration */main() {{register int weight;int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}}
WYNIK:
error: address of register variable 'weight' requested
Następna tabela podsumowuje główne cechy każdej klasy pamięci, które są powszechnie używane w programowaniu w C.
Klasa pamięci | Deklaracja | Przechowywanie | Domyślna wartość początkowa | Zakres | Dożywotni |
automatyczny | Wewnątrz funkcji / bloku | Pamięć | Nieobliczalny | W obrębie funkcji / bloku | W obrębie funkcji / bloku |
zarejestrować | Wewnątrz funkcji / bloku | Rejestry procesora | Śmieci | W obrębie funkcji / bloku | W obrębie funkcji / bloku |
zewnętrzny | Poza wszystkimi funkcjami | Pamięć | Zero | Cały plik i inne pliki, w których zmienna jest zadeklarowana jako extern | program runtime |
Statyczny (lokalny) | Wewnątrz funkcji / bloku | Pamięć | Zero | W obrębie funkcji / bloku | program runtime |
Statyczny (globalny) | Poza wszystkimi funkcjami | Pamięć | Zero | Światowy | program runtime |
Podsumowanie
W tym samouczku omówiliśmy klasy pamięci w C, podsumowując:
- Klasa pamięci w C służy do reprezentowania dodatkowych informacji o zmiennej.
- Klasa magazynu reprezentuje zakres i żywotność zmiennej.
- Informuje również, kto może uzyskać dostęp do zmiennej i skąd?
- Auto, extern, register, static to cztery różne klasy pamięci w programie C.
- Specyfikator klasy pamięci w języku C służy do definiowania zmiennych, funkcji i parametrów.
- auto jest używane dla zmiennej lokalnej zdefiniowanej w bloku lub funkcji
- register służy do przechowywania zmiennej w rejestrach procesora, a nie w lokalizacji pamięci w celu szybkiego dostępu.
- Statyczny jest używany zarówno dla zmiennych globalnych, jak i lokalnych. Każdy ma swój przypadek użycia w programie C.
- Extern służy do udostępniania danych między plikami projektu C.