Klasy pamięci w C: Auto, Extern, Static, Register (przykłady)
Co to jest klasa pamięci w C?
Klasa pamięci masowej reprezentuje widoczność i lokalizację zmiennej. Informuje, z której części kodu możemy uzyskać dostęp do zmiennej. Klasa pamięci masowej w C jest używana do opisywania następujących rzeczy:
- Zakres zmienny.
- Lokalizacja, w której zmienna będzie przechowywana.
- Zainicjowana wartość zmiennej.
- Czas życia zmiennej.
- Kto może uzyskać dostęp do zmiennej?
Zatem klasa pamięci jest używana do reprezentowania informacji o zmiennej.
UWAGA: Zmienna jest nie tylko powiązana z a typ danych, jego wartość, ale także klasa przechowywania.
Jakie są typy klas pamięci w C?
Istnieją w sumie cztery typy standardowych klas przechowywania. Poniższa tabela przedstawia klasy pamięci w języku C.
Klasa pamięci | Cel |
---|---|
samochód | Jest to domyślna klasa pamięci. |
zewnętrzny | Jest to zmienna globalna. |
statyczny | Jest to zmienna lokalna, która może zwrócić wartość nawet wtedy, gdy sterowanie zostanie przekazane wywołaniu funkcji. |
zarejestrować | Jest to zmienna przechowywana w rejestrze. |
Klasa automatycznego przechowywania w C
Zmienne zdefiniowane przy użyciu klasy automatycznego przechowywania nazywane są zmiennymi lokalnymi. Auto oznacza automatyczną klasę przechowywania. Zmienna domyślnie znajduje się w klasie automatycznego przechowywania, jeśli nie została wyraźnie określona.
Zakres zmiennej auto jest ograniczony tylko do konkretnego bloku. Gdy kontrola wychodzi poza blok, dostęp zostaje zniszczony. Oznacza to, że tylko blok, w którym zmienna auto jest zadeklarowana, może uzyskać do niej dostęp.
Słowo kluczowe auto służy do definiowania klasy pamięci automatycznej. Domyślnie zmienna automatyczna zawiera wartość śmieciową.
Example, auto int age;
Poniższy program definiuje funkcję posiadającą dwie zmienne lokalne
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ą względem siebie niezależne:
#include <stdio.h> int main( ) { auto int j = 1; { auto int j= 2; { auto int j = 3; printf ( " %d ", j); } printf ( "\t %d ",j); } printf( "%d\n", j);}
WYDAJNOŚĆ:
3 2 1
Klasa pamięci zewnętrznej w języku C
Extern oznacza klasę pamięci zewnętrznej. Klasa pamięci zewnętrznej jest używana, gdy mamy funkcje lub zmienne globalne, które są współdzielone między dwoma lub większą liczbą plików.
słowo kluczowe zewnętrzny służy do deklarowania zmiennej globalnej lub funkcji w innym pliku w celu zapewnienia odniesienia do zmiennej lub funkcji, która została już zdefiniowana w oryginalnym pliku.
Zmienne zdefiniowane za pomocą słowa kluczowego extern nazywane są zmiennymi globalnymi. Zmienne te są dostępne w całym programie. Zauważ, że zmienna extern nie może zostać zainicjowana, ponieważ została już zdefiniowana w oryginalnym pliku.
Example, extern void display();
Pierwszy plik: main.c
#include <stdio.h> extern i; main() { printf("value of the external integer is = %d\n", i); return 0;}
Drugi plik: oryginał.c
#include <stdio.h> i=48;
Wynik:
value of the external integer is = 48
Aby skompilować i uruchomić powyższy kod, wykonaj poniższe kroki
Krok 1) Utwórz nowy projekt,
- Wybierz aplikację konsolową
- Kliknij Przejdź
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 original.c) i dodaj go do bieżącego projektu, klikając „OK” w oknie dialogowym.
Krok 8) Umieść i zapisz kod C oryginalnego pliku.c pokazanego w poprzednim przykładzie bez funkcji main().
Krok 9) Zbuduj i uruchom swój projekt. Wynik pokazano na następnym rysunku
Klasa pamięci statycznej w języku C
Zmienne statyczne są używane w funkcji/pliku jako lokalne zmienne statyczne. Można je również wykorzystać jako zmienna globalna
- Statyczna zmienna lokalna to zmienna lokalna, która zachowuje i przechowuje swoją wartość pomię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 do pliku, w którym jest zadeklarowany.
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 ciągu swojego życia.
#include <stdio.h> /* 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= 7 iteration=15 and counter= 8 iteration=16 and counter= 9
Zmienne globalne są dostępne w całym pliku, natomiast zmienne statyczne są dostępne tylko dla określonej części kodu.
Żywotność zmiennej statycznej jest zawarta 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 przechowywania rejestrów, jeśli zamiast tego chcesz przechowywać zmienne lokalne w funkcjach lub blokach w rejestrach procesora 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 zarejestrować służy do deklarowania klasy przechowywania rejestrów. Zmienne zadeklarowane przy użyciu klasy przechowywania rejestru mają żywotność przez cały program.
Jest ona podobna do klasy automatycznego przechowywania. Zmienna jest ograniczona do konkretnego bloku. Jedyna różnica polega na tym, że zmienne zadeklarowane przy użyciu klasy przechowywania rejestrów są przechowywane w rejestrach procesora, a nie w pamięci. Rejestr ma szybszy dostęp niż pamięć główna.
Zmienne zadeklarowane przy użyciu klasy przechowywania rejestrów nie mają wartości domyślnej. Zmienne te są często deklarowane na początku programu.
#include <stdio.h> /* 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*/} }
WYDAJNOŚĆ:
error: address of register variable 'weight' requested
W poniższej tabeli podsumowano główne cechy każdej klasy pamięci masowej, które są powszechnie używane w programowaniu w języku C.
Klasa przechowywania | Deklaracja | Magazynowanie | Domyślna wartość początkowa | Zakres | Życie |
---|---|---|---|---|---|
samochód | 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 | czas wykonania programu |
Statyczne (lokalne) | Wewnątrz funkcji/bloku | Pamięć | Zero | W obrębie funkcji/bloku | czas wykonania programu |
Statyczne (globalne) | Poza wszystkimi funkcjami | Pamięć | Zero | Globalne | czas wykonania programu |
Podsumowanie
W tym tutorialu omówiliśmy klasy pamięci w C, podsumowując:
- Klasa pamięci w języku C służy do reprezentowania dodatkowych informacji o zmiennej.
- Klasa pamięci reprezentuje zakres i czas życia zmiennej.
- Mówi także, 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ęzyk C. służy do definiowania zmiennych, funkcji i parametrów.
- auto jest używane dla zmiennej lokalnej zdefiniowanej w bloku lub funkcji
- rejestr 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 w przypadku zmiennych globalnych, jak i lokalnych. Każdy z nich ma swój przypadek użycia w programie C.
- Extern służy do udostępniania danych pomiędzy plikami projektów C.