pointers pointer operations c
Εντατική μελέτη των δεικτών και των χρήσεών τους στο C ++.
Ο δείκτης είναι ένα από τα πιο ισχυρά χαρακτηριστικά της γλώσσας C ++. Ένας δείκτης βοηθά στον χειρισμό των μεταβλητών μέσω της διεύθυνσής του.
πώς να εκτελέσετε ένα εκτελέσιμο αρχείο βάζου
Σε αυτό το σεμινάριο, θα διερευνήσουμε τα πάντα σχετικά με τους δείκτες και τις χρήσεις του στο C ++ λεπτομερώς.
=> Παρακολουθήστε την απλή σειρά εκπαίδευσης C ++ εδώ.
Τι θα μάθετε:
- Τι είναι ένας δείκτης;
- Αριθμητική δείκτη
- Null και Void δείκτες
- Πίνακες και δείκτες
- Σειρά δεικτών
- Δείκτης δεικτών
- Περνώντας δείκτες σε λειτουργίες
- Δείκτες λειτουργιών
- συμπέρασμα
- Συνιστώμενη ανάγνωση
Τι είναι ένας δείκτης;
Ο δείκτης είναι μια μεταβλητή που κρατά τη διεύθυνση μιας θέσης μνήμης. Γνωρίζουμε ότι όλες οι μεταβλητές που δηλώνουμε, έχουν μια συγκεκριμένη διεύθυνση στη μνήμη. Δηλώνουμε μια μεταβλητή δείκτη που οδηγεί σε αυτές τις διευθύνσεις στη μνήμη.
Η γενική σύνταξη για τη δήλωση μιας μεταβλητής δείκτη είναι:
datatype * variable_name;
Για παράδειγμα, τη δήλωση int * ptr;
Αυτό σημαίνει ότι το ptr είναι ένας δείκτης που δείχνει μια μεταβλητή τύπου int. Ως εκ τούτου, μια μεταβλητή δείκτη περιέχει πάντα μια θέση μνήμης ή μια διεύθυνση. Ας δούμε τη λειτουργία των μεταβλητών δείκτη παρακάτω.
Σκεφτείτε ότι έχουμε τις ακόλουθες δηλώσεις:
Int p, *ptr; //declare variable p and pointer variable ptr p = 4; //assign value 4 to variable p ptr = &p; //assign address of p to pointer variable ptr
Στη μνήμη, αυτές οι δηλώσεις θα αναπαρασταθούν ως εξής:
Αυτή είναι η εσωτερική αναπαράσταση του δείκτη στη μνήμη. Όταν εκχωρούμε τη μεταβλητή διεύθυνσης στη μεταβλητή δείκτη, δείχνει τη μεταβλητή όπως φαίνεται στην παραπάνω αναπαράσταση.
Καθώς το ptr έχει διεύθυνση μεταβλητής p, το * ptr θα δώσει την τιμή της μεταβλητής p (μεταβλητή την οποία δείχνει η μεταβλητή ptr).
Σημείωση: Ο τελεστής * που χρησιμοποιούμε με το δείκτη χρησιμοποιείται για να δηλώσει ότι είναι μια μεταβλητή δείκτη.
Ας δούμε μερικές από τις έννοιες του δείκτη που χρησιμοποιούνται στο C ++.
Αριθμητική δείκτη
Γνωρίζουμε ότι μια μεταβλητή δείκτη δείχνει πάντα τη διεύθυνση στη μνήμη. Μεταξύ των λειτουργιών που μπορούμε να εκτελέσουμε, έχουμε τις ακόλουθες αριθμητικές πράξεις που εκτελούνται σε δείκτες.
- Τελεστής αύξησης (++)
- Χειριστής μείωσης (-)
- Προσθήκη (+)
- Αφαίρεση (-)
Ας δούμε τη χρήση αυτών των λειτουργιών σε ένα παράδειγμα προγράμματος.
#include #include using namespace std; int main() { int myarray(5) = {2, 4,6, 8,10}; int* myptr; myptr = myarray; cout<<'First element in the array :'<<*myptr< Παραγωγή:
Πρώτο στοιχείο στον πίνακα: 2
επόμενο στοιχείο στον πίνακα: 4
επόμενο στοιχείο στον πίνακα: 6
επόμενο στοιχείο στον πίνακα: 4
επόμενο στοιχείο στον πίνακα: 2
Έχουμε δει τις αριθμητικές πράξεις να πραγματοποιούνται σε δείκτες. Σημειώστε ότι ο τελεστής αύξησης ++ αυξάνει τον δείκτη και δείχνει στο επόμενο στοιχείο του πίνακα. Ομοίως, ο τελεστής μείωσης μειώνει τη μεταβλητή δείκτη κατά 1 έτσι ώστε να δείχνει στο προηγούμενο στοιχείο του πίνακα.
Χρησιμοποιούμε επίσης χειριστές + και -. Αρχικά, προσθέσαμε 1 στη μεταβλητή δείκτη. Το αποτέλεσμα δείχνει ότι δείχνει στο επόμενο στοιχείο του πίνακα. Ομοίως, - ο τελεστής κάνει τη μεταβλητή δείκτη για να δείχνει στο προηγούμενο στοιχείο του πίνακα.
Εκτός από αυτούς τους αριθμητικούς τελεστές, μπορούμε επίσης να χρησιμοποιήσουμε τελεστές σύγκρισης όπως ==,.
Null και Void δείκτες
Εάν, σε μια περίπτωση, μια μεταβλητή δείκτη δεν έχει εκχωρηθεί διεύθυνση μιας μεταβλητής, τότε είναι καλή πρακτική να αντιστοιχίζετε μια τιμή NULL στη μεταβλητή δείκτη. Η μεταβλητή δείκτη με τιμή NULL ονομάζεται δείκτης NULL.
Ένας μηδενικός δείκτης είναι ένας σταθερός δείκτης με τιμή μηδέν που ορίζεται στην iostream κεφαλίδα. Η μνήμη στη διεύθυνση 0 δεσμεύεται από το λειτουργικό σύστημα και δεν έχουμε πρόσβαση σε αυτήν την τοποθεσία.
Χρησιμοποιώντας το μηδενικό δείκτη, μπορούμε να αποφύγουμε την κακή χρήση αχρησιμοποίητων δεικτών και να αποτρέψουμε από τις μεταβλητές δείκτη να έχουν οριστεί ορισμένες τιμές απορριμμάτων.
Οι άδειοι δείκτες είναι οι ειδικοί δείκτες που δείχνουν τις τιμές χωρίς τύπο. Οι άδειοι δείκτες είναι πιο ευέλικτοι καθώς μπορούν να δείχνουν οποιονδήποτε τύπο. Αλλά δεν μπορούν να υποτιμηθούν άμεσα. Για αποπαραπομπή, ο κενός δείκτης πρέπει να μετατραπεί σε δείκτη που δείχνει μια τιμή με τον συγκεκριμένο τύπο δεδομένων.
Έχουμε δείξει τη λειτουργία του δείκτη NULL & void στο ακόλουθο παράδειγμα κώδικα.
#include #include using namespace std; int main() { int intvar = 10; char c = 'A'; void* vptr; int* myptr = NULL; cout<<'NULL pointer value :'< Παραγωγή:
Τιμή δείκτη NULL: 0
Το άδειο δείκτη vptr δείχνει: A
Το άδειο δείκτη vptr δείχνει: 10
Στο παραπάνω πρόγραμμα, πρώτα, δηλώνουμε έναν ακέραιο δείκτη στον οποίο έχει αντιστοιχιστεί τιμή NULL. Όταν εκτυπώνουμε αυτόν τον δείκτη, βλέπουμε ότι η τιμή είναι 0 όπως έχουμε συζητήσει προηγουμένως.
Στη συνέχεια, δηλώνουμε ένα κενό δείκτη. Αρχικά, εκχωρούμε μια διεύθυνση μεταβλητής χαρακτήρων σε αυτόν τον κενό δείκτη. Στη συνέχεια, αντιστοιχίζουμε το άδειο δείκτη σε ένα δείκτη χαρακτήρων και το πληκτρολογούμε με char *. Στη συνέχεια, εκτυπώνουμε την τιμή charptr που δείχνει το char A που ήταν μια μεταβλητή χαρακτήρων που δηλώσαμε νωρίτερα και επισημαίνεται από το κενό δείκτη.
Στη συνέχεια, έχουμε αντιστοιχίσει μια ακέραια μεταβλητή στον άδειο δείκτη και στη συνέχεια πραγματοποιούμε τα ίδια βήματα αποπαραγωγής αυτού του κενού δείκτη χρησιμοποιώντας έναν ακέραιο δείκτη.
Πίνακες και δείκτες
Οι πίνακες και οι δείκτες συνδέονται στενά μεταξύ τους. Γνωρίζουμε ότι το όνομα του πίνακα δείχνει το πρώτο στοιχείο του πίνακα και αυτός είναι ένας σταθερός δείκτης.
Μπορούμε να αντιστοιχίσουμε αυτόν τον δείκτη σε μια μεταβλητή δείκτη και, στη συνέχεια, να προσπελάσουμε τον πίνακα είτε με τη μείωση του δείκτη είτε με τη χρήση του τελεστή συνδρομής.
Θα δούμε αυτήν τη συσχέτιση μεταξύ της μεταβλητής δείκτη και του πίνακα στο ακόλουθο παράδειγμα κώδικα.
#include #include using namespace std; int main() { int myarray(5) = {1, 1, 2, 3, 5}; int* ptrvar; ptrvar = myarray; for(int i=0;i<5;i++) { cout<<*ptrvar<<' '; ptrvar++; } return 0; }
Παραγωγή:
1 1 2 3 5
Στο παραπάνω πρόγραμμα, εκχωρούμε το όνομα του πίνακα σε μια μεταβλητή δείκτη. Καθώς το όνομα του πίνακα δείχνει το πρώτο στοιχείο του πίνακα, μπορούμε να εκτυπώσουμε τα περιεχόμενα ολόκληρου του πίνακα χρησιμοποιώντας μια μεταβλητή δείκτη και να το αυξήσουμε χρησιμοποιώντας τον τελεστή ++. Αυτό εμφανίζεται στην έξοδο.
Σειρά δεικτών
Μερικές φορές, χρειαζόμαστε περισσότερες από μία μεταβλητές δείκτη σε ένα πρόγραμμα. Αντί να δηλώσουμε κάθε μεμονωμένη μεταβλητή δείκτη, μπορούμε να δηλώσουμε μια σειρά από δείκτες.
πώς μπορώ να ανοίξω ένα αρχείο eps
Ας πάρουμε αμέσως ένα παράδειγμα για να δείξουμε μια σειρά από δείκτες.
#include #include using namespace std; int main() { int myarray(5) = {2,4,6,8,10}; int *ptr(5); //array of pointers for(int i=0;i<5;i++){ ptr(i) = &myarray(i); } for (int i = 0; i < 5; i++) { cout << 'Value of myarray(' << i << ') = '; cout << *ptr(i) << endl; } return 0; }
Παραγωγή:
Τιμή myarray (0) = 2
Τιμή myarray (1) = 4
Τιμή myarray (2) = 6
Τιμή myarray (3) = 8
Τιμή myarray (4) = 10
Στη δήλωση στα παραπάνω,
int * ptr (5);
Μπορούμε να ερμηνεύσουμε ως: Το ptr είναι μια σειρά από 5 ακέραιους δείκτες. Ως εκ τούτου, κάθε στοιχείο του ptr θα δείχνει μια μεταβλητή ακέραιου τύπου.
Χρησιμοποιούμε έναν ακέραιο πίνακα και εκχωρούμε τη διεύθυνση κάθε στοιχείου του πίνακα σε κάθε ένα από τα στοιχεία ptr. Στη συνέχεια, προβάλλουμε τα περιεχόμενα της συστοιχίας ptr εξάγοντας '* ptr (i)'.
Δείκτης δεικτών
Ο δείκτης των δεικτών δεν είναι παρά πολλαπλές κατευθύνσεις. Είναι ένα είδος αλυσίδας δεικτών. Όταν ορίζουμε έναν δείκτη δεικτών, ο πρώτος δείκτης έχει μια διεύθυνση του δεύτερου δείκτη, ο οποίος με τη σειρά του έχει τη διεύθυνση της μεταβλητής στην οποία δείχνει.
Στη μνήμη, αυτό θα αναπαρασταθεί ως:

Ένας δείκτης δεικτών δηλώνεται ως εξής:
int** intptr;
Παίρνουμε άμεσα ένα παράδειγμα κώδικα για να κατανοήσουμε καλύτερα τον δείκτη των δεικτών.
#include #include using namespace std; int main() { int *vptr; int ** intptr; int var = 10; vptr = &var; intptr = &vptr; cout<<'Variable var: '< Παραγωγή:
Μεταβλητή μεταβλητή: 10
Δείκτης προς μεταβλητή: 10
Δείκτης προς δείκτη σε μεταβλητή: 10
Στο παραπάνω πρόγραμμα, δηλώνουμε μια ακέραια μεταβλητή, έναν ακέραιο δείκτη και έναν δείκτη ενός δείκτη σε έναν ακέραιο. Όπως φαίνεται στο πρόγραμμα, η μεταβλητή δείκτη αντιστοιχεί στην τιμή μιας μεταβλητής. Στον δείκτη της μεταβλητής δείκτη εκχωρείται η διεύθυνση της μεταβλητής δείκτη.
Στο τέλος, εκτυπώνουμε τις τρεις μεταβλητές που εμφανίζουν την ίδια τιμή 10 ίση με μια ακέραια μεταβλητή.
Περνώντας δείκτες σε λειτουργίες
Το πέρασμα των δεικτών στη λειτουργία είναι το ίδιο με άλλες τεχνικές παράδοσης παραμέτρων όπου μεταδίδουμε μεταβλητές δείκτη στη συνάρτηση.
Επανεξετάζουμε την ανταλλαγή δύο τιμών και την τροποποιούμε για να μεταβιβάζουμε μεταβλητές δείκτη ως παραμέτρους.
#include #include using namespace std; void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int a, b; cout<>a>>b; cout<<'a = '< Παραγωγή:
Εισαγάγετε τις τιμές που θα ανταλλάξετε: 3 2
a = 3 b = 2
Ανταλλαγμένες τιμές
a = 2 b = 3
Όπως φαίνεται στο πρόγραμμα, περνάμε τις τιμές που θα ανταλλάσσονται ως ακέραιες μεταβλητές. Οι τυπικές παράμετροι ορίζονται ως μεταβλητές δείκτη. Ως αποτέλεσμα αυτού, οι αλλαγές που έγιναν στις μεταβλητές μέσα στις συναρτήσεις αντικατοπτρίζονται επίσης στη λειτουργία κλήσης
Δείκτες λειτουργιών
με τον ίδιο τρόπο, καθώς έχουμε δείκτες σε μεταβλητές, πίνακες κ.λπ., μπορούμε επίσης να έχουμε δείκτες σε συναρτήσεις. Αλλά η διαφορά είναι ότι ο δείκτης συνάρτησης δείχνει τον εκτελέσιμο κώδικα και όχι σε δεδομένα όπως μεταβλητές ή πίνακες.
Παίρνουμε ένα παράδειγμα για να δείξουμε δείκτες λειτουργίας.
#include #include using namespace std; void displayVal(int a) { printf('Value of a is %d
', a); } int main() { void (*func_ptr)(int) = &displayVal; (*func_ptr)(100); return 0; }
Παραγωγή:
Η τιμή του είναι 100
ανοιχτός πίνακας κατακερματισμού διευθύνσεων c ++
Στο παραπάνω πρόγραμμα, έχουμε μια συνάρτηση «displayVal» η οποία εκτυπώνει απλώς μια ακέραια τιμή. Στην κύρια συνάρτηση, έχουμε ορίσει έναν δείκτη συνάρτησης «func_ptr» που παίρνει ένα int ως όρισμα και επιστρέφει έναν κενό τύπο.
άκυρο (* func_ptr) (int)
Σημείωση: Πρέπει να περικλείσουμε το δείκτη λειτουργίας μέσα (). Εάν το παραλείψουμε, θα γίνει πρωτότυπο λειτουργίας.
Έχουμε εκχωρήσει τη διεύθυνση της συνάρτησης «displayVal» σε αυτόν το δείκτη λειτουργίας. Στη συνέχεια, χρησιμοποιώντας αυτόν το δείκτη συνάρτησης «func_ptr» περνάμε την τιμή ορίσματος 100, η οποία είναι ισοδύναμη με την κλήση displayVal με το όρισμα 100.
Τώρα, εάν έχουμε άλλη συνάρτηση με το ίδιο πρωτότυπο, τότε μπορούμε να χρησιμοποιήσουμε τον ίδιο δείκτη συνάρτησης, εκχωρώντας τη διεύθυνση της συνάρτησης σε αυτό. Αυτή είναι η κύρια χρήση των δεικτών λειτουργίας.
συμπέρασμα
Αυτό αφορά όλους τους δείκτες, τους ορισμούς και τις χρήσεις του στο C ++.
Στο επόμενο σεμινάριό μας, θα μάθουμε περισσότερα σχετικά με τις αναφορές στο C ++. Οι αναφορές έχουν επίσης ειδική χρήση στο C ++ και χρησιμοποιούνται συχνά ως ψευδώνυμα για μεταβλητές.
=> Κάντε κλικ εδώ για την σειρά απόλυτης προπόνησης C ++.
Συνιστώμενη ανάγνωση