Κατηγορίες αποθήκευσης σε C: Auto, Extern, Static, Register (Παραδείγματα)

⚡ Έξυπνη Σύνοψη

Οι κλάσεις αποθήκευσης στη C ορίζουν το πεδίο εφαρμογής, τη διάρκεια ζωής, την προεπιλεγμένη τιμή και τη θέση μνήμης κάθε μεταβλητής, χρησιμοποιώντας τέσσερις προσδιοριστές — auto, register, static και extern — για να ελέγχουν πού διαμένουν τα δεδομένα και για πόσο καιρό επιβιώνουν κατά την εκτέλεση.

  • 🗂️ Τέσσερις κατηγορίες αποθήκευσης: Η C παρέχει αυτόματους, καταχωρητές, στατικούς και εξωτερικούς προσδιοριστές για την περιγραφή κάθε μεταβλητής.
  • 🏠 Αυτοκίνητο: Η προεπιλεγμένη τοπική κλάση, περιορισμένη στο μπλοκ της και διατηρώντας μια τιμή απορριμμάτων μέχρι να της ανατεθεί.
  • Κανω ΕΓΓΡΑΦΗ: Ζητά αποθήκευση στον καταχωρητή της CPU για ταχύτερη πρόσβαση σε συχνά χρησιμοποιούμενες μεταβλητές, όπως οι μετρητές.
  • ♻️ Στατικός: Διατηρεί μια μεταβλητή τιμή μεταξύ των κλήσεων συνάρτησης και ορίζει την προεπιλεγμένη τιμή στο μηδέν κατά την πρώτη χρήση.
  • 🌐 Εξωτερικός: Μοιράζεται μια καθολική μεταβλητή ή συνάρτηση σε πολλά αρχεία πηγαίου κώδικα χωρίς να την επαναπροσδιορίζει.
  • 📊 Πεδίο εφαρμογής και διάρκεια ζωής: Κάθε κλάση ορίζει πού είναι ορατή μια μεταβλητή και για πόσο καιρό θα διαρκέσει.

Μαθήματα αποθήκευσης στο C

Τι είναι η Κατηγορία αποθήκευσης στο 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) Δημιουργία νέου έργου,

  • Επιλέξτε Εφαρμογή Κονσόλας
  • Κάντε κλικ στο κουμπί Μετάβαση

Δημιουργία νέου έργου στο Code Μπλοκ

Βήμα 2) Επιλέξτε C και κάντε κλικ στο κουμπί Επόμενο

Επιλέξτε γλώσσα C

Βήμα 3) Κάντε κλικ στο Επόμενο

Κάντε κλικ στο κουμπί Επόμενο

Βήμα 4) Εισαγάγετε τα στοιχεία και κάντε κλικ στο κουμπί Επόμενο

Εισαγάγετε λεπτομέρειες έργου

Βήμα 5) Κάντε κλικ στο Τέλος

Κάντε κλικ στο κουμπί Τέλος

Βήμα 6) Τοποθετήστε τον κύριο κώδικα όπως φαίνεται στο προηγούμενο πρόγραμμα στο αρχείο main.c και αποθηκεύστε τον

Προσθήκη κώδικα στο main.c

Βήμα 7) Δημιουργήστε ένα νέο αρχείο C [Αρχείο -> νέο -> Κενό Αρχείο , αποθηκεύστε το (ως original.c) και προσθέστε το στο τρέχον έργο κάνοντας κλικ στο "OK" στο παράθυρο διαλόγου.

Δημιουργία αρχείου original.c

Βήμα 8) Τοποθετήστε και αποθηκεύστε τον κώδικα C του αρχικού αρχείου .c που φαίνεται στο προηγούμενο παράδειγμα χωρίς τη συνάρτηση main().

Προσθήκη κώδικα στο original.c

Βήμα 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 Σκουπίδια Εντός της λειτουργίας/μπλοκ Εντός της λειτουργίας/μπλοκ
εξωτερικός Εκτός όλων των λειτουργιών Μνήμη Μηδέν Ολόκληρο το αρχείο και άλλα αρχεία όπου η μεταβλητή δηλώνεται ως εξωτερική χρόνο εκτέλεσης προγράμματος
Στατικό (τοπικό) Μέσα σε μια λειτουργία/μπλοκ Μνήμη Μηδέν Εντός της λειτουργίας/μπλοκ χρόνο εκτέλεσης προγράμματος
Στατική (παγκόσμια) Εκτός όλων των λειτουργιών Μνήμη Μηδέν Παγκόσμιο χρόνο εκτέλεσης προγράμματος

Συχνές Ερωτήσεις

Το πεδίο εφαρμογής (scope) αποφασίζει πού θα είναι ορατή μια μεταβλητή στον κώδικα, ενώ το lifetime (διάρκεια ζωής) αποφασίζει για πόσο καιρό παραμένει στη μνήμη. Μια μεταβλητή μπορεί να έχει πεδίο εφαρμογής μπλοκ αλλά και διάρκεια ζωής που να καλύπτει όλο το πρόγραμμα.

Και οι δύο δημιουργούν τοπικές μεταβλητές με εμβέλεια μπλοκ, αλλά τις διατηρεί αυτόματα στη μνήμη με μια προεπιλογή άχρηστων στοιχείων, ενώ ο καταχωρητής ζητά ταχύτερη αποθήκευση στον καταχωρητή της CPU και απαγορεύει τη λήψη της διεύθυνσης της μεταβλητής.

Όχι. Το register είναι απλώς ένα αίτημα. Ο μεταγλωττιστής μπορεί να το αγνοήσει όταν δεν υπάρχει ελεύθερος καταχωρητής. Οι σύγχρονοι μεταγλωττιστές βελτιστοποιούν αυτόματα τη χρήση του καταχωρητή, επομένως η λέξη-κλειδί σπάνια χρειάζεται πλέον.

Οι στατικές και οι εξωτερικές μεταβλητές βρίσκονται σε ένα τμήμα μνήμης με μηδενική αρχικοποίηση για ολόκληρο το πρόγραμμα, επομένως ξεκινούν από το μηδέν. Οι αυτόματες μεταβλητές επαναχρησιμοποιούν τη μνήμη στοίβας, διατηρώνταςping όποια αξία κι αν είχε απομείνει.

Μια εξωτερική δήλωση ανακοινώνει μόνο μια μεταβλητή που έχει οριστεί αλλού και δεν μπορεί να αρχικοποιηθεί. Ο πραγματικός ορισμός, σε ένα αρχείο, κατανέμει τον χώρο αποθήκευσης και η σύνδεση συνδέει κάθε αναφορά σε αυτόν.

Ως επί το πλείστον, αλλά όχι ακριβώς. C++ καταργήθηκε η λέξη-κλειδί register και επαναχρησιμοποιήθηκε το auto για την εξαγωγή συμπερασμάτων τύπου. Ωστόσο, το static και το extern συμπεριφέρονται παρόμοια. C++ προσθέτει τους κανόνες αποθήκευσης thread_local και class-member.

Ναι. Οι βοηθοί τεχνητής νοημοσύνης περιγράφουν την αυτόματη, την καταχωρητή, την στατική και την εξωτερική, προτείνουν τον σωστό προσδιοριστή για κάθε μεταβλητή και επισημαίνουν τυχόν κακή χρήση, όπως η λήψη της διεύθυνσης μιας μεταβλητής καταχωρητή.

GitHub Copilot Συμπληρώνει αυτόματα στατικούς μετρητές, εξωτερικές δηλώσεις σε αρχεία και υποδείξεις καταχωρητών και, στη συνέχεια, εξηγεί το εύρος και τη διάρκεια ζωής ενσωματωμένα καθώς πληκτρολογείτε.

Συνοψίστε αυτήν την ανάρτηση με: