Δείκτες (pointers)
Οι δείκτες είναι ένα χρήσιμο εργαλείο με το οποίο ο προγραμματιστής μπορεί να διαχειριστεί τη μνήμη καλύτερα και αποδοτικότερα. Επίσης η χρήση δεικτών βελτιώνει την ταχύτητα του προγράμματος.
Με τους δείκτες μπορούμε να περάσουμε μεταβλητές με αναφορά (by reference) σε συναρτήσεις αλλά και να χρησιμοποιήσουμε σύνθετες δομές δεδομένων όπως λίστες κ.λπ.
Τιμή και διεύθυνση μεταβλητής
Για να καταλάβουμε καλύτερα πως λειτουργούν οι δείκτες θα πρέπει πρώτα να δούμε τι είναι η τιμή μεταβλητής και η διεύθυνση μεταβλητής.
Τιμή μεταβλητής
Όταν καταχωρούμε μια τιμή σε μια μεταβλητή, αυτή την τιμή την καλούμε τιμή της μεταβλητής.
Διεύθυνση μεταβλητής
Κάθε φορά που δηλώνουμε μια μεταβλητή δεσμεύουμε ένα μέρος της μνήμης. Η μνήμη είναι διευθυνσιοθετημένη και επομένως για κάθε διεύθυνση αντιστοιχεί κάποιος αριθμός ο οποίος συνήθως είναι σε δεκαεξαδική μορφή.
Παράδειγμα
Μπορούμε να διαβάσουμε την τιμή της διεύθυνσης μιας μεταβλητής με τη χρήση του συμβόλου &
.
#include <stdio.h> int main () { /* δήλωση και αρχικοποίηση μεταβλητής */ int i = 100; /* εκτύπωση τιμής μεταβλητής */ printf("%d\n", i); /* εκτύπωση τιμής διεύθυνσης μεταβλητής (προσέξτε το σύμβολο &) */ printf("%d\n", &i); /* εκτύπωση τιμής διεύθυνσης μεταβλητής σε δεκαεξαδική μορφή */ printf("%x\n", &i); return 0; }
234156724
df4f2b4
Μεταβλητές δείκτες
Ο δείκτης είναι ένας ειδικός τύπος μεταβλητής που χρησιμοποιείται για να αποθηκεύουμε τις τιμές διευθύνσεων, ή απλά διευθύνσεων, άλλων μεταβλητών.
Για να δηλώσουμε μια μεταβλητή-δείκτη ή απλά δείκτη, χρησιμοποιούμε τον αστερίσκο *
.
Δηλαδή πληκτρολογούμε: int *p;
Για να αποθηκεύσουμε μια διεύθυνση σε έναν δείκτη πληκτρολογούμε: p = &i;
Παράδειγμα
#include <stdio.h> int main () { int i = 100; /* δήλωση και αρχικοποίηση μεταβλητής */ int *p; /* δήλωση δείκτη τύπου int */ p = &i; /* αποθήκευση τιμής διεύθυνσης σε δείκτη */ printf("%d\n", i); /* εκτύπωση τιμής μεταβλητής */ printf("%x\n", &i); /* εκτύπωση τιμής διεύθυνσης μεταβλητής */ printf("%x\n", p); /* εκτύπωση τιμής δείκτη = διεύθυνσης μεταβλητής */ return 0; }
df9ce6fc
df9ce6fc
&i
και p
είναι ίδιες αφού έχουμε δηλώσει p = &i;
.