Δείκτες C ++ με παραδείγματα

Πίνακας περιεχομένων:

Anonim

Τι είναι οι δείκτες;

Στο C ++, ένας δείκτης αναφέρεται σε μια μεταβλητή που κρατά τη διεύθυνση μιας άλλης μεταβλητής. Όπως οι κανονικές μεταβλητές, οι δείκτες έχουν έναν τύπο δεδομένων. Για παράδειγμα, ένας δείκτης ακέραιου τύπου μπορεί να διατηρήσει τη διεύθυνση μιας μεταβλητής τύπου ακέραιου τύπου. Ένας δείκτης τύπου χαρακτήρα μπορεί να διατηρήσει τη διεύθυνση μιας μεταβλητής του τύπου χαρακτήρα.

Θα πρέπει να δείτε έναν δείκτη ως συμβολική αναπαράσταση μιας διεύθυνσης μνήμης. Με δείκτες, τα προγράμματα μπορούν να προσομοιώσουν την κλήση με αναφορά. Μπορούν επίσης να δημιουργήσουν και να χειριστούν δυναμικές δομές δεδομένων. Στο C ++, μια μεταβλητή δείκτη αναφέρεται σε μια μεταβλητή που δείχνει μια συγκεκριμένη διεύθυνση σε μια μνήμη που υποδεικνύεται από μια άλλη μεταβλητή.

Σε αυτό το σεμινάριο C ++, θα μάθετε:

  • Τι είναι οι δείκτες;
  • Διευθύνσεις στο C ++
  • Σύνταξη δήλωσης δείκτη
  • Τελεστής αναφοράς (&) και τελεστής Deference (*)
  • Δείκτες και πίνακες
  • Δείκτης NULL
  • Δείκτες μεταβλητών
  • Εφαρμογή δεικτών
  • Πλεονεκτήματα της χρήσης δεικτών

Διευθύνσεις στο C ++

Για να κατανοήσετε τους δείκτες C ++, πρέπει να καταλάβετε πώς οι υπολογιστές αποθηκεύουν δεδομένα.

Όταν δημιουργείτε μια μεταβλητή στο πρόγραμμα C ++, εκχωρείται κάποιος χώρος στη μνήμη του υπολογιστή. Η τιμή αυτής της μεταβλητής αποθηκεύεται στην καθορισμένη θέση.

Για να μάθετε τη θέση στη μνήμη του υπολογιστή όπου αποθηκεύονται τα δεδομένα, το C ++ παρέχει τον τελεστή & (αναφοράς). Ο τελεστής επιστρέφει τη διεύθυνση που καταλαμβάνει μια μεταβλητή.

Για παράδειγμα, εάν x είναι μεταβλητή, & x επιστρέφει τη διεύθυνση της μεταβλητής.

Σύνταξη δήλωσης δείκτη

Η δήλωση του C ++ λαμβάνει την ακόλουθη σύνταξη:

datatype *variable_name;
  • Ο τύπος δεδομένων είναι ο βασικός τύπος του δείκτη που πρέπει να είναι έγκυρος τύπος δεδομένων C ++.
  • Το όνομα_μεταβλητής πρέπει να είναι το όνομα της μεταβλητής δείκτη.
  • Ο αστερίσκος που χρησιμοποιείται παραπάνω για δήλωση δείκτη είναι παρόμοιος με τον αστερίσκο που χρησιμοποιείται για την εκτέλεση λειτουργίας πολλαπλασιασμού. Είναι ο αστερίσκος που σηματοδοτεί τη μεταβλητή ως δείκτη.

Ακολουθεί ένα παράδειγμα έγκυρων δηλώσεων δείκτη στο C ++:

int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character

Τελεστής αναφοράς (&) και τελεστής Deference (*)

Ο τελεστής αναφοράς (&) επιστρέφει τη διεύθυνση της μεταβλητής.

Ο τελεστής dereference (*) μας βοηθά να λάβουμε την τιμή που έχει αποθηκευτεί σε μια διεύθυνση μνήμης.

Για παράδειγμα:

Εάν έχουμε μια μεταβλητή που έχει το όνομα num, αποθηκεύεται στη διεύθυνση 0x234 και αποθηκεύει την τιμή 28.

Ο τελεστής αναφοράς (&) θα επιστρέψει 0x234.

Ο τελεστής διαγραφής (*) θα επιστρέψει 5.

Παράδειγμα 1:

#include using namespace std;int main() {int x = 27;int *ip;ip = &x;cout << "Value of x is : ";cout << x << endl;cout << "Value of ip is : ";cout << ip<< endl;cout << "Value of *ip is : ";cout << *ip << endl;return 0;}

Παραγωγή:

Πώς λειτουργεί:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Εισαγάγετε το αρχείο κεφαλίδας iostream. Αυτό θα μας επιτρέψει να χρησιμοποιήσουμε τις λειτουργίες που ορίζονται στο αρχείο κεφαλίδας χωρίς να λάβουμε σφάλματα.
  2. Συμπεριλάβετε το χώρο ονομάτων std για να χρησιμοποιήσετε τις κλάσεις του χωρίς να το καλέσετε.
  3. Καλέστε την κύρια λειτουργία (). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα αυτής της λειτουργίας. Το {σηματοδοτεί την αρχή του σώματος της συνάρτησης.
  4. Δηλώστε μια ακέραια μεταβλητή x και εκχωρώντας την τιμή 27.
  5. Δηλώστε μια μεταβλητή δείκτη * ip.
  6. Αποθηκεύστε τη διεύθυνση της μεταβλητής x στη μεταβλητή δείκτη.
  7. Εκτυπώστε λίγο κείμενο στην κονσόλα.
  8. Εκτυπώστε την τιμή της μεταβλητής x στην οθόνη.
  9. Εκτυπώστε λίγο κείμενο στην κονσόλα.
  10. Εκτυπώστε τη διεύθυνση της μεταβλητής x. Η τιμή της διεύθυνσης αποθηκεύτηκε στη μεταβλητή ip.
  11. Εκτυπώστε λίγο κείμενο στην κονσόλα.
  12. Εκτύπωση τιμής αποθηκευμένης στη διεύθυνση του δείκτη.
  13. Το πρόγραμμα θα πρέπει να επιστρέψει την τιμή κατά την επιτυχή εκτέλεση.
  14. Τέλος του σώματος της κύριας () συνάρτησης.

Δείκτες και πίνακες

Οι πίνακες και οι δείκτες λειτουργούν με βάση μια σχετική ιδέα. Υπάρχουν διαφορετικά πράγματα που πρέπει να σημειωθούν όταν εργάζεστε με πίνακες με δείκτες. Το ίδιο το όνομα του πίνακα δηλώνει τη διεύθυνση βάσης του πίνακα. Αυτό σημαίνει ότι για να αντιστοιχίσετε τη διεύθυνση ενός πίνακα σε ένα δείκτη, δεν πρέπει να χρησιμοποιείτε ένα συμπλεκτικό σύμβολο (&).

Για παράδειγμα:

p = arr;

Τα παραπάνω είναι σωστά αφού το arr αντιπροσωπεύει τη διεύθυνση των συστοιχιών. Εδώ είναι ένα άλλο παράδειγμα:

p = &arr;

Τα παραπάνω είναι λανθασμένα.

Μπορούμε να μετατρέψουμε σιωπηρά έναν πίνακα σε δείκτη. Για παράδειγμα:

int arr [20];int * ip;

Ακολουθεί μια έγκυρη λειτουργία:

ip = arr;

Μετά την παραπάνω δήλωση, τα ip και arr θα είναι ισοδύναμα και θα μοιράζονται ιδιότητες. Ωστόσο, μια διαφορετική διεύθυνση μπορεί να αντιστοιχιστεί στο ip, αλλά δεν μπορούμε να εκχωρήσουμε τίποτα στο arr.

Παράδειγμα 2:

Αυτό το παράδειγμα δείχνει πώς να διασχίσετε έναν πίνακα χρησιμοποιώντας δείκτες:

#include using namespace std;int main() {int *ip;int arr[] = { 10, 34, 13, 76, 5, 46 };ip = arr;for (int x = 0; x < 6; x++) {cout << *ip << endl;ip++;}return 0;}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Δηλώστε μια ακέραια μεταβλητή δείκτη ip.
  2. Δηλώστε έναν πίνακα που ονομάζεται arr και αποθηκεύστε 6 ακέραιους αριθμούς σε αυτό.
  3. Εκχώρηση arr στο ip. Το ip και arr θα γίνουν ισοδύναμα.
  4. Δημιουργήστε ένα για βρόχο. Η μεταβλητή βρόχου x δημιουργήθηκε για να επαναλάβει τα στοιχεία του πίνακα από το ευρετήριο 0 έως 5.
  5. Εκτυπώστε τις τιμές που είναι αποθηκευμένες στη διεύθυνση του δείκτη IP. Μια τιμή θα επιστραφεί ανά επανάληψη και θα πραγματοποιηθούν συνολικά 6 επαναλήψεις. Το endl είναι μια λέξη-κλειδί C ++ που σημαίνει την τελική γραμμή. Αυτή η ενέργεια σάς επιτρέπει να μετακινήσετε τον κέρσορα στην επόμενη γραμμή μετά την εκτύπωση κάθε τιμής. Κάθε τιμή θα εκτυπωθεί σε μια μεμονωμένη γραμμή.
  6. Για να μετακινήσετε το δείκτη στην επόμενη θέση int μετά από κάθε επανάληψη.
  7. Τέλος του βρόχου.
  8. Το πρόγραμμα πρέπει να επιστρέψει κάτι μετά την επιτυχή εκτέλεση.
  9. Τέλος του κύριου () σώματος λειτουργίας.

Δείκτης NULL

Εάν δεν υπάρχει ακριβής διεύθυνση που πρόκειται να εκχωρηθεί, τότε η μεταβλητή δείκτη μπορεί να εκχωρηθεί NULL. Θα πρέπει να γίνει κατά τη δήλωση. Ένας τέτοιος δείκτης είναι γνωστός ως μηδενικός δείκτης. Η τιμή του είναι μηδέν και ορίζεται σε πολλές τυπικές βιβλιοθήκες όπως το iostream.

Παράδειγμα 3:

#include using namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Δηλώστε μια μεταβλητή δείκτη ip και εκχωρήστε την τιμή NULL.
  2. Τιμή εκτύπωσης της μεταβλητής δείκτη ip μαζί με κάποιο κείμενο στην κονσόλα.
  3. Το πρόγραμμα πρέπει να επιστρέψει την τιμή μετά την επιτυχή ολοκλήρωση.
  4. Τέλος του σώματος της κύριας () συνάρτησης.

Δείκτες μεταβλητών

Με το C ++, μπορείτε να χειριστείτε δεδομένα απευθείας από τη μνήμη του υπολογιστή.

Ο χώρος μνήμης μπορεί να εκχωρηθεί ή να εκχωρηθεί εκ νέου σύμφωνα με τις επιθυμίες. Αυτό γίνεται εφικτό από τις μεταβλητές δείκτη.

Οι μεταβλητές δείκτη δείχνουν μια συγκεκριμένη διεύθυνση στη μνήμη του υπολογιστή που υποδεικνύεται από μια άλλη μεταβλητή.

Μπορεί να δηλωθεί ως εξής:

int *p;

Ή,

int* p;

Στο παράδειγμα σας, έχουμε δηλώσει τη μεταβλητή δείκτη p.

Θα περιέχει μια διεύθυνση μνήμης.

Ο αστερίσκος είναι ο τελεστής dereference που σημαίνει ένα δείκτη.

Ο δείκτης p δείχνει μια ακέραια τιμή στη διεύθυνση μνήμης.

Παράδειγμα 4:

#include using namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Δηλώστε μια μεταβλητή δείκτη p και μια μεταβλητή x με τιμή 30.
  2. Εκχωρήστε τη διεύθυνση της μεταβλητής x σε p.
  3. Εκτυπώστε την τιμή της μεταβλητής δείκτη p μαζί με κάποιο κείμενο στην κονσόλα.
  4. Το πρόγραμμα πρέπει να επιστρέψει την τιμή μετά την επιτυχή ολοκλήρωση.
  5. Τέλος του σώματος της κύριας () συνάρτησης.

Εφαρμογή δεικτών

Οι συναρτήσεις στο C ++ μπορούν να επιστρέψουν μόνο μία τιμή. Επιπλέον, όλες οι μεταβλητές που δηλώνονται σε μια συνάρτηση κατανέμονται στη στοίβα κλήσεων συνάρτησης. Μόλις επιστρέψει η συνάρτηση, όλες οι μεταβλητές στοίβας καταστρέφονται.

Τα επιχειρήματα προς συνάρτηση μεταβιβάζονται κατά τιμή και οποιαδήποτε τροποποίηση γίνεται στις μεταβλητές δεν αλλάζει την τιμή των πραγματικών μεταβλητών που μεταβιβάζονται. Το ακόλουθο παράδειγμα βοηθά στην απεικόνιση αυτής της έννοιας: -

Παράδειγμα 5:

#include using namespace std;void test(int*, int*);int main() {int a = 5, b = 5;cout << "Before changing: << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;test(&a, &b);cout << "\nAfter changing" << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;}void test(int* n1, int* n2) {*n1 = 10;*n2 = 11;}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Δημιουργήστε ένα πρωτότυπο μιας συνάρτησης που ονομάζεται δοκιμή που θα λάβει δύο ακέραιες παραμέτρους.
  2. Καλέστε την κύρια λειτουργία (). Θα προσθέσουμε τη λογική του προγράμματος μέσα στο σώμα του.
  3. Δηλώστε δύο ακέραιες μεταβλητές a και b, καθεμία με τιμή 5.
  4. Εκτυπώστε λίγο κείμενο στην κονσόλα. Το endl (τελική γραμμή) θα μετακινήσει τον κέρσορα για να ξεκινήσει η εκτύπωση στην επόμενη γραμμή.
  5. Εκτυπώστε την τιμή της μεταβλητής α στην κονσόλα μαζί με άλλο κείμενο. Το endl (τελική γραμμή) θα μετακινήσει τον κέρσορα για να ξεκινήσει η εκτύπωση στην επόμενη γραμμή.
  6. Εκτυπώστε την τιμή της μεταβλητής b στην κονσόλα μαζί με άλλο κείμενο. Το endl (τελική γραμμή) θα μετακινήσει τον κέρσορα για να ξεκινήσει η εκτύπωση στην επόμενη γραμμή.
  7. Δημιουργήστε μια συνάρτηση που ονομάζεται test () που λαμβάνει τις διευθύνσεις της μεταβλητής a και b ως παραμέτρους.
  8. Εκτυπώστε λίγο κείμενο στην κονσόλα. Το \ n θα δημιουργήσει μια νέα κενή γραμμή πριν από την εκτύπωση του κειμένου. Το endl (τελική γραμμή) θα μετακινήσει τον κέρσορα για να ξεκινήσει η εκτύπωση στην επόμενη γραμμή μετά την εκτύπωση του κειμένου.
  9. Εκτυπώστε την τιμή της μεταβλητής α στην κονσόλα μαζί με άλλο κείμενο. Το endl (τελική γραμμή) θα μετακινήσει τον κέρσορα για να ξεκινήσει η εκτύπωση στην επόμενη γραμμή.
  10. Εκτυπώστε την τιμή της μεταβλητής b στην κονσόλα μαζί με άλλο κείμενο. Το endl (τελική γραμμή) θα μετακινήσει τον κέρσορα για να ξεκινήσει η εκτύπωση στην επόμενη γραμμή.
  11. Το πρόγραμμα πρέπει να επιστρέψει την τιμή μετά την επιτυχή ολοκλήρωση.
  12. Τέλος του σώματος της κύριας () συνάρτησης.
  13. Καθορισμός της δοκιμής λειτουργίας (). Η συνάρτηση πρέπει να λαμβάνει δύο ακέραιες μεταβλητές δείκτη * n1 και * n2.
  14. Αντιστοίχιση της μεταβλητής δείκτη * n1 τιμή 10.
  15. Αντιστοίχιση της μεταβλητής δείκτη * n2 τιμή 11.
  16. Τέλος του σώματος της δοκιμής λειτουργίας ().

Ακόμα κι αν, οι νέες τιμές αντιστοιχίζονται στη μεταβλητή a και b μέσα στη δοκιμή συνάρτησης, μόλις ολοκληρωθεί η κλήση συνάρτησης, το ίδιο δεν αντικατοπτρίζεται το κύριο κύριο της εξωτερικής λειτουργίας.

Η χρήση δεικτών ως ορίσματα συνάρτησης συμβάλλει στη διαβίβαση της πραγματικής διεύθυνσης της μεταβλητής στη συνάρτηση και όλες οι αλλαγές που πραγματοποιούνται στη μεταβλητή θα αντικατοπτρίζονται στην εξωτερική συνάρτηση.

Στην παραπάνω περίπτωση, η συνάρτηση «test» έχει τη διεύθυνση των μεταβλητών «a» και «b». Αυτές οι δύο μεταβλητές είναι άμεσα προσβάσιμες από τη συνάρτηση «test», και ως εκ τούτου οποιαδήποτε αλλαγή που γίνεται σε αυτές τις μεταβλητές αντικατοπτρίζεται στη συνάρτηση καλούντος «main».

Πλεονεκτήματα της χρήσης δεικτών

Εδώ, είναι τα πλεονεκτήματα / οφέλη από τη χρήση των δεικτών

  • Οι δείκτες είναι μεταβλητές που αποθηκεύουν τη διεύθυνση άλλων μεταβλητών στο C ++.
  • Περισσότερες από μία μεταβλητές μπορούν να τροποποιηθούν και να επιστραφούν με συνάρτηση χρησιμοποιώντας δείκτες.
  • Η μνήμη μπορεί να κατανέμεται δυναμικά και να απομεταχωρείται χρησιμοποιώντας δείκτες.
  • Οι δείκτες βοηθούν στην απλοποίηση της πολυπλοκότητας του προγράμματος.
  • Η ταχύτητα εκτέλεσης ενός προγράμματος βελτιώνεται χρησιμοποιώντας δείκτες.

Περίληψη:

  • Ένας δείκτης αναφέρεται σε μια μεταβλητή διεύθυνση κράτησης μιας άλλης μεταβλητής.
  • Κάθε δείκτης έχει έναν έγκυρο τύπο δεδομένων.
  • Ο δείκτης είναι μια συμβολική αναπαράσταση μιας διεύθυνσης μνήμης.
  • Οι δείκτες επιτρέπουν στα προγράμματα να προσομοιώνουν κλήσεις με αναφορά και να δημιουργούν και να χειρίζονται δυναμικές δομές δεδομένων.
  • Οι πίνακες και οι δείκτες χρησιμοποιούν μια σχετική ιδέα.
  • Το όνομα του πίνακα δηλώνει τη βάση του πίνακα.
  • Εάν θέλετε να αντιστοιχίσετε τη διεύθυνση ενός πίνακα σε ένα δείκτη, μην χρησιμοποιήσετε ένα σύμβολο (&).
  • Εάν δεν υπάρχει συγκεκριμένη διεύθυνση για να εκχωρήσετε μια μεταβλητή δείκτη, εκχωρήστε την NULL.