Αντικειμενοστραφής Προγραμματισμός Δείκτες (Pointers)
Δείκτες Δείκτης (pointer) είναι μία μεταβλητή που περιέχει ως τιμή τη διεύθυνση μιας μεταβλητής Δήλωση μιας μεταβλητής τύπου δείκτη: όπως ισχύει και για οποιαδήποτε άλλη μεταβλητή, ένας δείκτης πρέπει πρώτα να δηλωθεί προτού μπορέσει να χρησιμοποιηθεί Η δήλωση: int *ptr; δηλώνει μία μεταβλητή τύπου δείκτη με όνομα ptr η οποία μπορεί να λάβει ως τιμή τις διευθύνσεις μεταβλητών τύπου int ένας δείκτης ο οποίος έχει ως τιμή τη διεύθυνση μιας μεταβλητής x, θεωρείται ότι ‘’δείχνει’’ προς τη μεταβλητή x
Κανονικές Μεταβλητές main τύπος δεδομένων 5 x διεύθυνση μεταβλητής int main() { int x; x = 5; return 0; } τύπος δεδομένων int FFAFE5 5 διεύθυνση μεταβλητής τιμή μεταβλητής x όνομα μεταβλητής
Τελεστές που σχετίζονται με δείκτες Μοναδιαίος Τελεστής & (τελεστής διεύθυνσης) εφαρμοζόμενος σε οποιαδήποτε μεταβλητή (ή αντικείμενο), επιστρέφει τη διεύθυνση της μεταβλητής (ή του αντικειμένου) Μοναδιαίος Τελεστής * (έμμεσης αναφοράς) εφαρμοζόμενος σε μεταβλητές τύπου δείκτη, επιστρέφει το περιεχόμενο της μνήμης προς την οποία ‘’δείχνει’’ ο δείκτης
Κανονικές Μεταβλητές και Δείκτες main int main() { int x; int *ptr; x = 5; ptr = &x; return 0; } int int* FFAFE5 5 FFAFE5 //o ptr δείχνει στην x x ptr
Δείκτες Αν ένας δείκτης ‘’δείχνει’’ προς μία μεταβλητή, μπορεί να χρησιμοποιηθεί για την έμμεση προσπέλαση της μεταβλητής int main() { int x; x = 5; } Για την εκτύπωση της x, οι εντολές cout << x; cout << *ptr; είναι ισοδύναμες int *ptr; ptr = &x; η έκφραση x = x + 1; είναι ισοδύναμη με την *ptr = *ptr + 1
Κλήση συναρτήσεων κατ’ αξία (call by value) #include <iostream> using namespace std; void setToZero(int var); int main( ) { int x; x = 5; setToZero(x); cout << x << endl; return 0; } void setToZero(int var) var = 0; Η τιμή της μεταβλητής x στη συνάρτηση main δεν αλλάζει μετά την κλήση της setToZero Η τιμή του ορίσματος κατά την κλήση της συνάρτησης αντιγράφεται στην αντίστοιχη παράμετρο της setToZero main x 5 στοίβα της main setToZero var στοίβα της setToZero
Κλήση συναρτήσεων κατ’ αναφορά (call by reference) #include <iostream> using namespace std; void setToZero(int *var); int main( ) { int x; x = 5; setToZero(&x); cout << x << endl; return 0; } void setToZero(int *var) *var = 0; Αυτό που περνά ως παράμετρος είναι η διεύθυνση της μεταβλητής x Η διεύθυνση αντιγράφεται στον αντίστοιχο δείκτη της setToZero ο οποίος προσπελαύνει την αρχική μεταβλητή main x 5 στοίβα της main &x setToZero *var στοίβα της setToZero