Ορισμοί

Οι δείκτες είναι απλά διευθύνσεις μνήμης. Μιά μεταβλητή δείκτη κρατά και 
αυτή μιά τιμή. Η τιμή αυτή είναι η διεύθυνση μνήμης μιάς άλλης μεταβλητής. 

Το πρόγραμμα στο αρχείο POINTER.C δίνει ένα πρώτο παράδειγμα ορισμού και 
χρήσης δεικτών.

Ας ξεκινήσουμε από τις δηλώσεις μεταβλητών. Διαπιστώνουμε οτι δηλώνουμε 
μιάν ακέραια μεταβλητή με όνομα index. Επίσης ορίζουμε δύο άλλα ονόματα,  
τα pt1 και pt2 τα οποία όμως έχουν ως πρόθεμα έναν αστερίσκο, δηλαδή *pt1, 
*pt2. Αυτό σημαίνει οτι οι μεταβλητές pt1 και pt2 είναι δείκτες οι οποίοι 
μπορούν να δείχνουν σε ακέραιες μεταβλητές. 

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

Συνεχίζοντας στις εκτελέσιμες προτάσεις βλέπουμε μιά εκχώρηση μιάς αρχικής 
τιμής, της τιμής 39, στη μεταβλητή index. Η επόμενη πρόταση έχει ενδιαφέρον 
αφού δείχνει τον τρόπο που εκχωρούμε αρχικές τιμές στους δείκτες. Η 
μεταβλητή δείκτη pt1 παίρνει ως αρχική τιμή την τιμή &index που διαβάζεται "η 
διεύθυνση μνήμης της μεταβλητής index". Το πρόθεμα & το έχουμε ήδη 
συναντήσει όταν συζητούσαμε γιά τις διευθύνσεις των στοιχείων ενός πίνακα. 
Εδώ διαπιστώνουμε οτι έχει γενική ισχύ και μπορούμε να θεωρήσουμε ως νόμιμη 
έκφραση της C την έκφραση

&μεταβλητή  : διεύθυνση μνήμης της μεταβλητής

Οι διευθύσεις μνήμης μπορούν να χαρακτηριστούν ως τιμές του τύπου μη-
προσημασμένου ακεραίου (unsigned int) ή μη-προσημασμένου μεγάλου 
ακεραίου (unsigned long int) με την έννοια οτι ξεκινούν από το 0 και 
συνεχίζουν μέχρι το τέλος του πεδίου διευθύνσεων. Ακόμη μπορούμε να 
θεωρήσουμε οτι γενικά ως αρχικές τιμές έχουμε

*μεταβλητή  = &μεταβλητή

Η επόμενη πρόταση είναι μάλλον προφανής οτι δηλαδή υπάρχει η δυνατότητα 
εκχώρησης της τιμής ενός δείκτης (μιας διεύθυνσης δηλαδή) σε έναν άλλο 
δείκτη. Μετά την εκτέλεση και αυτής της πρότασης έχουμε την ακόλουθη 
σχηματική κατάσταση στη μνήμη

και ισχύουν (ή δεν ισχύουν) οι παρακάτω σχέσεις

index == *pt1 == *pt2 == 39 (μιά τιμή)
&index == pt1 == pt2 == 10000 (μιά διεύθυνση)
&pt1 == 10002 (μιά άλλη διεύθυνση)
&pt2 == 10004 (μιά ακόμη διεύθυνση)
*(&pt1) == *(&pt2) == *index (μιά τιμή που είναι ίση με τα ...)
*index == yy  (... περιεχόμενα της θέσης μνήμης με διεύθυνση 39 -- λάθος)
&(*pt1) == &(*pt1) == &39 (η διεύθυνση μιάς τιμής -- ανύπαρκτη)
Δύο κανόνες

1. Το πρόθεμα & πριν από ένα όνομα μεταβλητής x ή γενικότερα μιά έκφραση z 
σημαίνει "η διεύθυνση θέσης μνήμης που συνδέεται με το όνομα x ή δίνεται από 
την έκφραση z". Συνήθως χρησιμοποιείται σε συνδυασμό με ονόματα κανονικών 
μεταβλητών.

2. Το πρόθεμα * πριν από ένα όνομα μεταβλητής p ή γενικότερα μιά έκφραση z 
σημαίνει "τρέχουσα τιμή της θέσης μνήμης που η διέυθυνσή της περιέχεται στη 
θέση μνήμης p ή δίνεται από την έκφραση z". Συνήθως χρησιμοποιείται σε 
συνδυασμό με ονόματα μεταβλητών δεικτών.

Πρσοσχή στο γεγονός οτι οι παράνομες ή ανύπαρκτες διευθύνσεις δεν γίνονται 
αντιληπτές από τον μεταφραστή ως συνατικά λάθος εκφράσεις. Είναι ευθύνη του 
προγραμματιστή να ελέγχει 'ποιός δείχνει που'. 

 Μετά από την πρόταση  εκτύπωσης ακολουθεί μιά πρόταση που δείχνει την 
πλήρη ισοδυναμία μεταξύ του ονόματος index και της έκφρασης *pt1. 

Η εκχώρηση *pt1 = 13  είναι ισοδύναμη με την εκχώρηση index = 13
 
Η εκχώρηση μιας τιμής σε μία μεταβλητή σημαίνει αλλαγή της τρέχουσας τιμής 
της μεταβλητής, δεν έχει σημασία αν την καλούμε άμεσα με το όνομά της 
(index) ή έμμεσα με κάποιον δείκτη (*pt1).  Αυτή η αντικατάσταση ονόματος 
από *δείκτη ισχύει γιά όλες τις εκφράσεις όπου συμμετέχει νόμιμα το όνομα 
μεταβλητής.

Η νέα κατάσταση στη μνήμη είναι σχηματικά

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

Η ισοδυναμία μεταξύ ονόματος και *δείκτη φαίνεται και από τις δύο προτάσεις 
εκτύπωσης των αποτελεσματων που εμφανίζουν τα αποτελέσματα.

The value is 39 39 39
The value is 13 13 13

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