Κατηγορίες αποθήκευσης σε C: Auto, Extern, Static, Register (Παραδείγματα)
⚡ Έξυπνη Σύνοψη
Οι κλάσεις αποθήκευσης στη C ορίζουν το πεδίο εφαρμογής, τη διάρκεια ζωής, την προεπιλεγμένη τιμή και τη θέση μνήμης κάθε μεταβλητής, χρησιμοποιώντας τέσσερις προσδιοριστές — auto, register, static και extern — για να ελέγχουν πού διαμένουν τα δεδομένα και για πόσο καιρό επιβιώνουν κατά την εκτέλεση.

Τι είναι η Κατηγορία αποθήκευσης στο C;
Μια κλάση αποθήκευσης αντιπροσωπεύει την ορατότητα και τη θέση μιας μεταβλητής. Λέει από ποιο μέρος του κώδικα μπορούμε να έχουμε πρόσβαση σε μια μεταβλητή. Μια κλάση αποθήκευσης στο C χρησιμοποιείται για να περιγράψει τα ακόλουθα πράγματα:
- Το μεταβλητό εύρος.
- Η τοποθεσία όπου θα αποθηκευτεί η μεταβλητή.
- Η αρχικοποιημένη τιμή μιας μεταβλητής.
- Μια διάρκεια ζωής μιας μεταβλητής.
- Ποιος μπορεί να έχει πρόσβαση σε μια μεταβλητή;
Έτσι, μια κλάση αποθήκευσης χρησιμοποιείται για να αναπαραστήσει τις πληροφορίες σχετικά με μια μεταβλητή.
ΣΗΜΕΙΩΣΗ: Μια μεταβλητή δεν σχετίζεται μόνο με ένα Τύπος δεδομένων, την αξία του αλλά και μια κατηγορία αποθήκευσης.
Ποιοι είναι οι τύποι τάξεων αποθήκευσης στο C;
Υπάρχουν συνολικά τέσσερις τύποι τυπικών κατηγοριών αποθήκευσης. Ο παρακάτω πίνακας αντιπροσωπεύει τις κατηγορίες αποθήκευσης στο C.
| Κατηγορία αποθήκευσης | Σκοπός |
| αυτόματη | Είναι μια προεπιλεγμένη κλάση αποθήκευσης. |
| εξωτερικός | Είναι μια καθολική μεταβλητή. |
| στατικός | Είναι μια τοπική μεταβλητή που μπορεί να επιστρέψει μια τιμή ακόμα και όταν ο έλεγχος μεταφέρεται στην κλήση συνάρτησης. |
| κάντε ΕΓΓΡΑΦΗ | Είναι μια μεταβλητή που αποθηκεύεται σε έναν Μητρώο. |
Κατηγορία Auto Storage στο C
Οι μεταβλητές που ορίζονται χρησιμοποιώντας την κλάση αυτόματης αποθήκευσης ονομάζονται τοπικές μεταβλητές. Το Auto σημαίνει κατηγορία αυτόματης αποθήκευσης. Μια μεταβλητή ανήκει στην κατηγορία αυτόματης αποθήκευσης από προεπιλογή, εάν δεν προσδιορίζεται ρητά.
Το εύρος μιας αυτόματης μεταβλητής περιορίζεται μόνο με το συγκεκριμένο μπλοκ. Μόλις ο έλεγχος βγει από το μπλοκ, η πρόσβαση καταστρέφεται. Αυτό σημαίνει ότι μόνο το μπλοκ στο οποίο έχει δηλωθεί η αυτόματη μεταβλητή μπορεί να έχει πρόσβαση σε αυτό.
Μια λέξη-κλειδί auto χρησιμοποιείται για να ορίσει μια κατηγορία αυτόματης αποθήκευσης. Από προεπιλογή, μια αυτόματη μεταβλητή περιέχει μια τιμή σκουπιδιών.
Example, auto int age;
Το παρακάτω πρόγραμμα ορίζει μια συνάρτηση με δύο τοπικές μεταβλητές
int add(void) { int a=13; auto int b=48; return a+b;}
Παίρνουμε ένα άλλο πρόγραμμα που δείχνει το επίπεδο εμβέλειας "επίπεδο ορατότητας" για τις αυτόματες μεταβλητές σε κάθε κωδικό μπλοκ που είναι ανεξάρτητα μεταξύ τους:
#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);}
Παραγωγή:
3 2 1
Κατηγορία εξωτερικής αποθήκευσης στο C
Το Extern σημαίνει κλάση εξωτερικής αποθήκευσης. Η κλάση εξωτερικής αποθήκευσης χρησιμοποιείται όταν έχουμε καθολικές συναρτήσεις ή μεταβλητές που μοιράζονται δύο ή περισσότερα αρχεία.
Η λέξη-κλειδί extern χρησιμοποιείται για τη δήλωση μιας καθολικής μεταβλητής ή συνάρτησης σε ένα άλλο αρχείο για να παρέχει την αναφορά της μεταβλητής ή της συνάρτησης που έχει ήδη οριστεί στο αρχικό αρχείο.
Οι μεταβλητές που ορίζονται χρησιμοποιώντας μια εξωτερική λέξη-κλειδί ονομάζονται καθολικές μεταβλητές. Αυτές οι μεταβλητές είναι προσβάσιμες σε όλο το πρόγραμμα. Σημειώστε ότι η εξωτερική μεταβλητή δεν μπορεί να αρχικοποιηθεί, έχει ήδη οριστεί στο αρχικό αρχείο.
Example, extern void display();
Πρώτο αρχείο: main.c
#include <stdio.h> extern i; main() { printf("value of the external integer is = %d\n", i); return 0;}
Δεύτερο Αρχείο: original.c
#include <stdio.h>
i=48;
Αποτέλεσμα:
value of the external integer is = 48
Για να μεταγλωττίσετε και να εκτελέσετε τον παραπάνω κώδικα, ακολουθήστε τα παρακάτω βήματα
Βήμα 1) Δημιουργία νέου έργου,
- Επιλέξτε Εφαρμογή Κονσόλας
- Κάντε κλικ στο κουμπί Μετάβαση
Βήμα 2) Επιλέξτε C και κάντε κλικ στο κουμπί Επόμενο
Βήμα 3) Κάντε κλικ στο Επόμενο
Βήμα 4) Εισαγάγετε τα στοιχεία και κάντε κλικ στο κουμπί Επόμενο
Βήμα 5) Κάντε κλικ στο Τέλος
Βήμα 6) Τοποθετήστε τον κύριο κώδικα όπως φαίνεται στο προηγούμενο πρόγραμμα στο αρχείο main.c και αποθηκεύστε τον
Βήμα 7) Δημιουργήστε ένα νέο αρχείο C [Αρχείο -> νέο -> Κενό Αρχείο , αποθηκεύστε το (ως original.c) και προσθέστε το στο τρέχον έργο κάνοντας κλικ στο "OK" στο παράθυρο διαλόγου.
Βήμα 8) Τοποθετήστε και αποθηκεύστε τον κώδικα C του αρχικού αρχείου .c που φαίνεται στο προηγούμενο παράδειγμα χωρίς τη συνάρτηση main().
Βήμα 9) Δημιουργήστε και εκτελέστε το έργο σας. Το αποτέλεσμα φαίνεται στο επόμενο σχήμα
Κατηγορία στατικής αποθήκευσης στο C
Οι στατικές μεταβλητές χρησιμοποιούνται στη συνάρτηση/αρχείο ως τοπικές στατικές μεταβλητές. Μπορούν επίσης να χρησιμοποιηθούν ως α καθολική μεταβλητή
- Η στατική τοπική μεταβλητή είναι μια τοπική μεταβλητή που διατηρεί και αποθηκεύει την τιμή της μεταξύ κλήσεων ή μπλοκ συναρτήσεων και παραμένει ορατή μόνο στη συνάρτηση ή το μπλοκ στο οποίο έχει οριστεί.
- Οι στατικές καθολικές μεταβλητές είναι καθολικές μεταβλητές ορατές μόνο στο αρχείο στο οποίο δηλώνονται.
Example: static int count = 10;
Λάβετε υπόψη ότι η στατική μεταβλητή έχει μια προεπιλεγμένη αρχική τιμή μηδέν και αρχικοποιείται μόνο μία φορά στη διάρκεια ζωής της.
#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);}
Αποτέλεσμα:
iteration=14 and counter= 7 iteration=15 and counter= 8 iteration=16 and counter= 9
Οι καθολικές μεταβλητές είναι προσβάσιμες σε όλο το αρχείο, ενώ οι στατικές μεταβλητές είναι προσβάσιμες μόνο στο συγκεκριμένο τμήμα ενός κώδικα.
Η διάρκεια ζωής μιας στατικής μεταβλητής βρίσκεται σε ολόκληρο τον κώδικα του προγράμματος. Μια μεταβλητή που δηλώνεται ή αρχικοποιείται χρησιμοποιώντας στατική λέξη-κλειδί περιέχει πάντα το μηδέν ως προεπιλεγμένη τιμή.
Εγγραφή Κατηγορίας Αποθήκευσης στο Γ
Μπορείτε να χρησιμοποιήσετε την κλάση αποθήκευσης καταχωρητών όταν θέλετε να αποθηκεύσετε τοπικές μεταβλητές εντός συναρτήσεων ή μπλοκ σε καταχωρητές CPU αντί για RAM για να έχετε γρήγορη πρόσβαση σε αυτές τις μεταβλητές. Για παράδειγμα, οι «μετρητές» είναι ένας καλός υποψήφιος για να αποθηκευτούν στο μητρώο.
Example: register int age;
Η λέξη-κλειδί register χρησιμοποιείται για τη δήλωση μιας κλάσης αποθήκευσης καταχωρητών. Οι μεταβλητές που δηλώνονται χρησιμοποιώντας την κλάση αποθήκευσης καταχωρητών έχουν διάρκεια ζωής σε όλο το πρόγραμμα.
Είναι παρόμοιο με την κατηγορία αυτόματης αποθήκευσης. Η μεταβλητή περιορίζεται στο συγκεκριμένο μπλοκ. Η μόνη διαφορά είναι ότι οι μεταβλητές που δηλώνονται χρησιμοποιώντας την κλάση αποθήκευσης καταχωρητών αποθηκεύονται σε καταχωρητές CPU αντί για μνήμη. Το Register έχει ταχύτερη πρόσβαση από αυτή της κύριας μνήμης.
Οι μεταβλητές που δηλώνονται με χρήση της κλάσης αποθήκευσης καταχωρητή δεν έχουν προεπιλεγμένη τιμή. Αυτές οι μεταβλητές δηλώνονται συχνά στην αρχή ενός προγράμματος.
#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*/} }
Παραγωγή:
error: address of register variable 'weight' requested
Ο επόμενος πίνακας συνοψίζει τα κύρια χαρακτηριστικά κάθε κλάσης αποθήκευσης που χρησιμοποιούνται συνήθως στον προγραμματισμό C
| Κατηγορία αποθήκευσης | Δήλωση | Αποθηκευτικός χώρος | Προεπιλεγμένη αρχική τιμή | Scope | Διάρκεια ζωής |
| αυτόματη | Μέσα σε μια λειτουργία/μπλοκ | Μνήμη | Απρόβλεπτος | Εντός της λειτουργίας/μπλοκ | Εντός της λειτουργίας/μπλοκ |
| κάντε ΕΓΓΡΑΦΗ | Μέσα σε μια λειτουργία/μπλοκ | Μητρώα CPU | Σκουπίδια | Εντός της λειτουργίας/μπλοκ | Εντός της λειτουργίας/μπλοκ |
| εξωτερικός | Εκτός όλων των λειτουργιών | Μνήμη | Μηδέν | Ολόκληρο το αρχείο και άλλα αρχεία όπου η μεταβλητή δηλώνεται ως εξωτερική | χρόνο εκτέλεσης προγράμματος |
| Στατικό (τοπικό) | Μέσα σε μια λειτουργία/μπλοκ | Μνήμη | Μηδέν | Εντός της λειτουργίας/μπλοκ | χρόνο εκτέλεσης προγράμματος |
| Στατική (παγκόσμια) | Εκτός όλων των λειτουργιών | Μνήμη | Μηδέν | Παγκόσμιο | χρόνο εκτέλεσης προγράμματος |








