Εμβέλεια μεταβλητών

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

Η πρώτη μεταβλητή που δηλώνεται είναι η count η οποία είναι γνωστή (έχει 
εμβέλεια) σε όλες τις συναρτήσεις του προγράμματος αφού δηλώνεται πριν από 
οποιαδήποτε συνάρητηση και έξω από όλες τις αγκύλες. Πρόκειται γιά γενική 
μεταβλητή (ή μεταβλητή αρχείου, αφού είναι γνωστή σε όλες τις συναρτήσεις του 
αρχείου SCOPE.C). Όταν λέμε οτι 'είναι γνωστή' σε όλες τις συναρτήσεις 
εννοούμε οτι μόλις ο μεταφραστής συνατήσει μιά δήλωση γενικής μεταβλητής 
τότε της αναθέτει μιά θέση μνήμης αντίστοιχου μεγέθους. Η θέεση αυτή της 
μνήμης παραμένει αναλλοίωτη σε όλες μεταβολές που μπορεί να συμβούν, π.χ. 
τις κλήσεις συναρτήσεων. Η θέσης μνήμης της γενικής μεταβλητής μπορεί να 
προσπελαστεί από οποιαδήποτε συνάρτηση.  

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

Επιστρέφουμε στο κυρίως πρόγραμμα. Αμέσως μετά το άνοιγμα των αγκυλών  
βλέπουμε τη δήλωση της μεταβλητής index που είναι μια΄τοπική μεταβλητή του 
κυρίως προγράμματος. Έχει εμβέλεια σε όλες τις προτάσεις, συναρτήσεις κλπ, 
που είναι δηλωμένες από το σημείο αυτό μέχρι το κλείσιμο της αγκύλης που 
άνοιξε το κυρίως πρόγραμμα. Ο μεταφραστής συνδέει τη θέση μνήμης αυτής της 
μεταβλητής με τη main. Η λέξη κλειδί register θα εξηγηθεί αργότερα και δεν 
παίζει ρόλο στον ορισμό της εμβέλειας της μεταβλητής.

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

Οι τοπικές μεταβλητές λέγονται και αυτόματες (automatic) μεταβλητές γιατί 
ενεργοποιούνται αυτόματα με τη κλήση της συνάρτησης (ή του τμήματος 
προγράμματος) όπου είναι δηλωμένες. Με τον τερματισμό της συνάρτησης 
παύουν να υπάρχουν πλέον. Φυσικά στη περίπτωση της main αυτό το σημείο δεν 
έχει και ιδιαίτερη σημασία μιά και το κυρίως πρόγραμμα ενεργοποιείται πρώτο 
και τερματίζεται τελευταίο. Αλλά έχει σημασία γιά τις τοπικές μεταβλητές των 
υπολοίπων συναρτήσεων.

Παρατηρείστε γιά παράδειγμα τη συνάρτηση head1 που έχει μιά τοπική 
μεταβλητή με το όνομα index. Η μεταβλητή αυτή δεν έχει καμμία σχέση με τη 
συνώνυμη μεταβλητή του κυρίως προγράμματος. Όταν η συνάρτηση head1 δεν 
εκτελείται τότε η μεταβλητή δεν υπάρχει. Μόλις η συνάρτηση κληθεί τότε η 
συνάρτηση δημιουργείται, χρησιμοποιείται και εξαφανίζεται με τον τερματισμό 
της συνάρτησης. Σε περίπτωση διαδοχικών κλήσεων της ίδιας συνάρτησης η τιμή 
της αυτόματης τοπικής μεταβλητής δεν διατηρείται από τη μία κλήση στην 
άλλη. 

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

static int index;

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

Αν η λέξη κλειδί static τοποθετηθεί πριν από τη δήλωση γενικής μεταβλητής 
τότε το νόημα είναι διαφορετικό. Γιά τον μεταφραστή αυτό σημαίνει οτι η γενική 
αυτή μεταβλητή δεν επιτρέπεται να χρησιμοποιηθεί από συναρτήσεις που 
βρίσκονται σε άλλο αρχείο. Μιά συνάρτηση μπορεί να κάνει χρήση γενικής 
μεταβλητής που είναι δηλωμένη σε άλλο αρχείο με τη λέξη κλειδί extern και 
αυτή λέγεται εξωτερική μεταβλητή.
Επικάλυψη εμβέλειας και συνωνυμία

Στη συνάρτηση head2 διαπιστώνουμε οτι δηλώνεται μιά τοπική μεταβλητή με το 
όνομα count που είναι ίδιο με το όνομα μιάς γενικής μεταβλητής. Σε περίπτωση 
τέτοιας επικάλυψης εμβέλειας δύο μεταβλητών επικρατεί η τοπικότερη. 
Επομένως γιά τη συνάρτηση head2  η γενική μεταβλητή  count δεν υπάρχει.

Να σημειωθεί οτι η επικάλυψη εμβέλειας δεν συμβαδίζει απαραίτητα με τη 
συνωνυμία δύο μεταβλητών. Υπάρχει μιά μεταβλητή index που είναι τοπική 
τόσο γιά το κυρίως πρόγραμμα όσο και γιά τη συνάρτηση head1. Εδώ έχουμε 
απλή συνωνυμία αλλά δεν μπαίνει θέμα επικάλυψης εμβέλειας. Η συνάρτηση 
head1 αγνοεί την ύπαρξη των τοπικών μεταβλητών του κυρίως προγράμματος 
αλλά και αντίστροφα.

Πριν προχωρήσουμε στις επεξηγήσεις των άλλων χαρακτηριστικών του 
προγράμματος ας δούμε το αποτέλεσμα της εκτέλεσής του.

The header1 value is 23
The header2 value is 53
The header3 value is 77
0 1 2 3 4 5 6  index is now 8
0 1 2 3 4 5 6  index is now 7
0 1 2 3 4 5 6  index is now 6
0 1 2 3 4 5 6  index is now 5
0 1 2 3 4 5 6  index is now 4
0 1 2 3 4 5 6  index is now 3
0 1 2 3 4 5 6  index is now 2
0 1 2 3 4 5 6  index is now 1
Μεταβλητές καταχωρητή

Η λέξη κλειδί register που χρησιμοποιήθηκε στη δήλωση της μεταβλητής 
index στη main δηλώνει οτι η συγκεκριμένη μεταβλητή θέλουμε να αποθηκευτεί 
όχι σε θέσεις μνήμης αλλά σε καταχωρητή της κεντρικής μονάδας επεξεργασίας. 
Αυτό μπορεί να γίνει γιά δύο λόγους. Πρώτος λόγος, ο λόγους ταχύτητας. Η 
προσπέλαση σε καταχωρητή είναι πολύ πιό γρήγορη από οτι στη μνήμη. Έτσι αν 
έχουμε κάποια μεταβλητή που συμμετέχει σε μιά ομάδα υπολογιστικά έντονων 
πράξεων τότε μπορούμε να τη θέσουμε σε ένα καταχωρητή. Ο δεύτερος λόγος 
είναι γιά την επικοινωνία με το λειτουργικό σύστημα. Το σύστημα διακοπών του 
DOS ειδικά επιβάλλει τη τοποθέτηση δεδομένων σε καταχωρητές πριν τη κλήση 
μιας διακοπής, γιά να τα βρεί εκεί η ρουτίνα εξυπηρέτησης της διακοπής. Ακόμη 
σε καταχωρητές βρίσκουμε τα παοτελέσματα των διακοπών.  Είναι φανερό οτι 
στη περίπτωσή μας ούτε ο ένας ούτε ο άλλος λόγος ισχύουν.

Περιεχόμενα Κεφαλαίου