Άρθρο #8: Δείκτες
C++ Programmer's Corner :: Προγραμματισμός :: C :: Άρθρα
Σελίδα 1 από 1
Άρθρο #8: Δείκτες
Δείκτης ονομάζεται ο μη αρνητικός ακέραιος ο οποίος "δείχνει" προς κάποια θέση στη μνήμη, δηλαδή αν ένας δείκτης έχει τιμή 1024, θα δείχνει προς το 1025ο ( Ν - 1 ) στοιχείο της μνήμης. Όλοι οι επεξεργαστές επιτρέπουν την ανάγνωση/εγγραφή θέσεων μνήμης με έμμεσο τρόπο, δηλαδή με δείκτες.
Στη C οι δείκτες δηλώνονται με έναν αστερίσκο πριν από το όνομα τους, για παράδειγμα:
Πολλοί ίσως έλεγαν ότι αφού είναι το ίδιο, γιατί υπάρχει αυτή η διαφοροποίηση... Η απάντηση είναι για την αποφυγή λαθών, την απλούστευση του κώδικα και, ίσως το πιο σημαντικό, επειδή κάθε αρχιτεκτονική μπορεί να έχει διαφορετικό μέγεθος δείκτη πχ 32-bit και 64-bit. Οι μεταγλωττιστές διαμαρτύρονται για παράδειγμα όταν προσπαθούμε να αναθέσουμε έναν ακέραιο σε έναν δείκτη χωρίς επιπλέον κώδικα "μετατροπής". Στο παρακάτω όμως υπάρχει μεγάλη διαφορά μεταξύ του δείκτη και της απλής μεταβλητής:
Αν θέλετε να λάβετε την διεύθυνση μιας μεταβλητής, βάζετε το εμπορικό ΚΑΙ ( ambersand & ) μπροστά από αυτή:
Εάν θέλετε να χρησιμοποιήσετε τον δείκτη για να λάβετε/αλλάξετε την τιμή στην οποία δείχνει, βάζετε τον αστερίσκο μπροστά απ`το όνομα του:
Επίσης, ένας δείκτης μπορεί να χρησιμοποιηθεί και σαν πίνακας, με την ίδια ακριβώς σύνταξη:
Τέλος, οι δείκτες είναι από τις πιο χρήσιμες μεταβλητές που υπάρχουν στη C, επειδή επιτρέπουν το πέρασμα μεταβλητών σε συναρτήσεις κατά αναφορά, όπου η συνάρτηση λαμβάνει απλά δείκτες και μπορεί να αλλάξει μια εξωτερική μεταβλητή. Επίσης, είναι ο μόνος τρόπος να γίνει δυναμική εκχώρηση μνήμης ( θα εξηγηθεί σε επόμενο άρθρο ) με τις standard συναρτήσεις της C. Πολλές δομές δεδομένων όπως συνδεδεμένες λίστες, δυαδικά δέντρα κτλ χρειάζονται δείκτες για να λειτουργήσουν.
Στη C οι δείκτες δηλώνονται με έναν αστερίσκο πριν από το όνομα τους, για παράδειγμα:
- Κώδικας:
int *integerPtr, integer;
Πολλοί ίσως έλεγαν ότι αφού είναι το ίδιο, γιατί υπάρχει αυτή η διαφοροποίηση... Η απάντηση είναι για την αποφυγή λαθών, την απλούστευση του κώδικα και, ίσως το πιο σημαντικό, επειδή κάθε αρχιτεκτονική μπορεί να έχει διαφορετικό μέγεθος δείκτη πχ 32-bit και 64-bit. Οι μεταγλωττιστές διαμαρτύρονται για παράδειγμα όταν προσπαθούμε να αναθέσουμε έναν ακέραιο σε έναν δείκτη χωρίς επιπλέον κώδικα "μετατροπής". Στο παρακάτω όμως υπάρχει μεγάλη διαφορά μεταξύ του δείκτη και της απλής μεταβλητής:
- Κώδικας:
float *realPtr, real;
Αν θέλετε να λάβετε την διεύθυνση μιας μεταβλητής, βάζετε το εμπορικό ΚΑΙ ( ambersand & ) μπροστά από αυτή:
- Κώδικας:
integerPtr = &integer;
Εάν θέλετε να χρησιμοποιήσετε τον δείκτη για να λάβετε/αλλάξετε την τιμή στην οποία δείχνει, βάζετε τον αστερίσκο μπροστά απ`το όνομα του:
- Κώδικας:
*integerPtr = 15;
Επίσης, ένας δείκτης μπορεί να χρησιμοποιηθεί και σαν πίνακας, με την ίδια ακριβώς σύνταξη:
- Κώδικας:
int *arrayPtr, array[10];
arrayPtr = array;
arrayPtr[4] = 123;
Τέλος, οι δείκτες είναι από τις πιο χρήσιμες μεταβλητές που υπάρχουν στη C, επειδή επιτρέπουν το πέρασμα μεταβλητών σε συναρτήσεις κατά αναφορά, όπου η συνάρτηση λαμβάνει απλά δείκτες και μπορεί να αλλάξει μια εξωτερική μεταβλητή. Επίσης, είναι ο μόνος τρόπος να γίνει δυναμική εκχώρηση μνήμης ( θα εξηγηθεί σε επόμενο άρθρο ) με τις standard συναρτήσεις της C. Πολλές δομές δεδομένων όπως συνδεδεμένες λίστες, δυαδικά δέντρα κτλ χρειάζονται δείκτες για να λειτουργήσουν.
Παρόμοια θέματα
» Άρθρο #9: Συμβολοσειρές
» Άρθρο #1: Γνωριμία με τη C
» Άρθρο #6: Συναρτήσεις
» Άρθρο #7: Πίνακες
» Άρθρο #3: Αριθμητικοί τελεστές
» Άρθρο #1: Γνωριμία με τη C
» Άρθρο #6: Συναρτήσεις
» Άρθρο #7: Πίνακες
» Άρθρο #3: Αριθμητικοί τελεστές
C++ Programmer's Corner :: Προγραμματισμός :: C :: Άρθρα
Σελίδα 1 από 1
Δικαιώματα σας στην κατηγορία αυτή
Δεν μπορείτε να απαντήσετε στα Θέματα αυτής της Δ.Συζήτησης
|
|