Στη γλώσσα C, η πρόσβαση σε διεύθυνση μνήμης μπορεί να γίνει μέσω της χρήσης δεικτών. Ο δείκτης είναι μια μεταβλητή που αποθηκεύει τη διεύθυνση μνήμης ενός αντικειμένου ή μιας μεταβλητής.
Για να αποκτήσουμε πρόσβαση σε μια διεύθυνση μνήμης, πρέπει να δηλώσουμε έναν δείκτη που αντιστοιχεί στον τύπο των δεδομένων που θέλουμε να αποθηκεύσουμε. Έπειτα, μπορούμε να χρησιμοποιήσουμε τον τελεστή αναφοράς (&) για να πάρουμε τη διεύθυνση μνήμης μιας μεταβλητής.
Για παράδειγμα, αν έχουμε μια μεταβλητή με όνομα “x”, μπορούμε να δηλώσουμε έναν δείκτη που δείχνει στη διεύθυνση μνήμης της “x” ως εξής:
int x = 5; int *ptr; // Δήλωση δείκτη ptr = &x; // Ανάθεση της διεύθυνσης μνήμης της "x" στον δείκτη
Έπειτα, μπορούμε να αποκτήσουμε πρόσβαση στην τιμή της “x” από τον δείκτη με τη χρήση του τελεστή αποκατάστασης (*):
int value = *ptr; // Απόκτηση της τιμής της "x" από τον δείκτη
Με τη χρήση δεικτών, μπορ
ούμε να προσπελάσουμε και να τροποποιήσουμε την τιμή μιας μεταβλητής μέσω της αναφοράς στην αντίστοιχη διεύθυνση μνήμης.
Παράδειγμα
#include <stdio.h> int main() { int num = 10; // Δήλωση μεταβλητής num με τιμή 10 printf("The memory address of variable num is: %p", &num); // Εκτύπωση της διεύθυνσης μνήμης της μεταβλητής num return 0; }
Ο κώδικας αυτός εκτυπώνει τη διεύθυνση μνήμης μιας μεταβλητής στη γλώσσα C. Πιο συγκεκριμένα, τα βήματα που ακολουθεί είναι τα εξής:
- Η γραμμή
#include <stdio.h>
εισάγει τη βιβλιοθήκηstdio.h
, η οποία περιέχει τη συνάρτησηprintf
. - Η συνάρτηση
main
είναι η κύρια συνάρτηση του προγράμματος και χρησιμοποιείται ως σημείο εκκίνησης. - Η γραμμή
int num = 10;
δηλώνει μια μεταβλητήnum
τύπουint
και την αρχικοποιεί με την τιμή 10. - Η συνάρτηση
printf
χρησιμοποιείται για να εκτυπώσει κείμενο στην οθόνη. Συγκεκριμένα, η γραμμήprintf("The memory address of variable num is: %p", &num);
εκτυπώνει το κείμενο “The memory address of variable num is: ” ακολουθούμενο από τη διεύθυνση μνήμης της μεταβλητήςnum
. Η%p
χρησιμοποιείται για τη μορφοποίηση της εκτύπωσης της διεύθυνσης μνήμης. - Τέλος, η συνάρτηση
main
επιστρέφει την τιμή 0 με την εντολήreturn 0;
, υποδεικνύοντας ότι το πρόγραμμα ολοκληρώθηκε με επιτυχία.
Το παραπάνω πρόγραμμα θα εκτυπώσει κάτι παρόμοιο με το παρακάτω ανάλογα με τη διεύθυνση μνήμης που εκχωρείται στη μεταβλητή num
:
The memory address of variable num is: 0x7fff584c82bc
Σημειώστε ότι η διεύθυνση μνήμης που εκτυπώνεται ενδέχεται να διαφέρει από το παραπάνω ανάλογα με τον υπολογιστή και το λειτουργικό σύστημα που χρησιμοποιείτε.
Σημείωση: Η διεύθυνση μνήμης είναι σε δεκαεξαδική μορφή (0x ..). Πιθανόν να μην λάβετε το ίδιο αποτέλεσμα στο πρόγραμμά σας, καθώς αυτό εξαρτάται από το πού αποθηκεύεται η μεταβλητή στον υπολογιστή σας.
Πρέπει επίσης να σημειώσετε ότι το &myAge ονομάζεται συχνά “δείκτης” (pointer). Ένας δείκτης αποθηκεύει τη διεύθυνση μνήμης μιας μεταβλητής ως την τιμή του. Για να εκτυπώσουμε τιμές δεικτών, χρησιμοποιούμε το μορφοποιητή μορφής %p.
Θα μάθετε πολύ περισσότερα σχετικά με τους δείκτες στο επόμενο κεφάλαιο.