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

Σε αυτό το σεμινάριο, θα μάθουμε για τη σχέση μεταξύ συστοιχιών και δεικτών με τη βοήθεια παραδειγμάτων.

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

Εξετάστε αυτό το παράδειγμα:

 int *ptr; int arr(5); // store the address of the first // element of arr in ptr ptr = arr;

Εδώ, το ptr είναι μια μεταβλητή δείκτη ενώ το arr είναι ένας intπίνακας. Ο κώδικας ptr = arr;αποθηκεύει τη διεύθυνση του πρώτου στοιχείου του πίνακα σε μεταβλητή ptr.

Παρατηρήστε ότι έχουμε χρησιμοποιήσει arrαντί &arr(0). Αυτό συμβαίνει επειδή και τα δύο είναι τα ίδια. Έτσι, ο παρακάτω κώδικας είναι ο ίδιος με τον παραπάνω κώδικα.

 int *ptr; int arr(5); ptr = &arr(0);

Οι διευθύνσεις για τα υπόλοιπα στοιχεία της κεραίας δίνεται από &arr(1), &arr(2), &arr(3)και &arr(4).

Σημείωση σε κάθε στοιχείο σειράς

Ας υποθέσουμε ότι πρέπει να δείξουμε το τέταρτο στοιχείο του πίνακα χρησιμοποιώντας το ίδιο δείκτη ptr.

Εδώ, εάν το ptr δείχνει το πρώτο στοιχείο στο παραπάνω παράδειγμα τότε ptr + 3θα δείξει το τέταρτο στοιχείο. Για παράδειγμα,

 int *ptr; int arr(5); ptr = arr; ptr + 1 is equivalent to &arr(1); ptr + 2 is equivalent to &arr(2); ptr + 3 is equivalent to &arr(3); ptr + 4 is equivalent to &arr(4);

Παρομοίως, μπορούμε να έχουμε πρόσβαση στα στοιχεία χρησιμοποιώντας τον μοναδικό δείκτη. Για παράδειγμα,

 // use dereference operator *ptr == arr(0); *(ptr + 1) is equivalent to arr(1); *(ptr + 2) is equivalent to arr(2); *(ptr + 3) is equivalent to arr(3); *(ptr + 4) is equivalent to arr(4);

Ας υποθέσουμε ότι έχουμε αρχικοποιήσει ptr = &arr(2);τότε

 ptr - 2 is equivalent to &arr(0); ptr - 1 is equivalent to &arr(1); ptr + 1 is equivalent to &arr(3); ptr + 2 is equivalent to &arr(4);
Εργασία C ++ Pointers με συστοιχίες

Σημείωση: Η διεύθυνση μεταξύ ptr και ptr + 1 διαφέρει κατά 4 byte. Επειδή το ptr είναι δείκτης intδεδομένων. Και, το μέγεθος του int είναι 4 byte σε ένα λειτουργικό σύστημα 64-bit.

Ομοίως, εάν ο δείκτης ptr δείχνει charδεδομένα τύπου, τότε η διεύθυνση μεταξύ ptr και ptr + 1 είναι 1 byte. Επειδή το μέγεθος ενός χαρακτήρα είναι 1 byte.

Παράδειγμα 1: Δείκτες και πίνακες C ++

 // C++ Program to display address of each element of an array #include using namespace std; int main() ( float arr(3); // declare pointer variable float *ptr; cout << "Displaying address using arrays: " << endl; // use for loop to print addresses of all array elements for (int i = 0; i < 3; ++i) ( cout << "&arr(" << i << ") = " << &arr(i) << endl; ) // ptr = &arr(0) ptr = arr; cout<<"Displaying address using pointers: "<< endl; // use for loop to print addresses of all array elements // using pointer notation for (int i = 0; i < 3; ++i) ( cout << "ptr + " << i << " = "<< ptr + i << endl; ) return 0; )

Παραγωγή

 Εμφάνιση διεύθυνσης με συστοιχίες: & arr (0) = 0x61fef0 & arr (1) = 0x61fef4 & arr (2) = 0x61fef8 Εμφάνιση διεύθυνσης με δείκτες: ptr + 0 = 0x61fef0 ptr + 1 = 0x61fef4 ptr + 2 = 0x61fef8

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

Στη συνέχεια, χρησιμοποιήσαμε το δείκτη ptr για να δείξουμε τη διεύθυνση του (0), ptr + 1για να δείξουμε τη διεύθυνση του (1) και ούτω καθεξής.

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

Ωστόσο, πρέπει να θυμόμαστε ότι οι δείκτες και οι πίνακες δεν είναι οι ίδιοι.

Υπάρχουν μερικές περιπτώσεις όπου τα ονόματα των πινάκων δεν αποσυντίθενται σε δείκτες. Για να μάθετε περισσότερα, επισκεφθείτε: Πότε το όνομα του πίνακα δεν αποσυντίθεται σε δείκτη;

Παράδειγμα 2: Όνομα πίνακα που χρησιμοποιείται ως δείκτης

 // C++ Program to insert and display data entered by using pointer notation. #include using namespace std; int main() ( float arr(5); // Insert data using pointer notation cout << "Enter 5 numbers: "; for (int i = 0; i > *(arr + i) ; ) // Display data using pointer notation cout << "Displaying data: " << endl; for (int i = 0; i < 5; ++i) ( // display value of arr(i) cout << *(arr + i) << endl ; ) return 0; )

Παραγωγή

 Εισαγάγετε 5 αριθμούς: 2.5 3.5 4.5 5 2 Εμφάνιση δεδομένων: 2.5 3.5 4.5 5 2

Εδώ,

  1. Χρησιμοποιήσαμε αρχικά τη σημείωση δείκτη για να αποθηκεύσουμε τους αριθμούς που εισήγαγε ο χρήστης στον πίνακα arr.

     cin>> *(arr + i) ;

    Αυτός ο κωδικός είναι ισοδύναμος με τον παρακάτω κώδικα:

     cin>> arr(i);

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

    Όπως ήδη γνωρίζουμε, το όνομα πίνακα arr δείχνει το πρώτο στοιχείο του πίνακα. Έτσι, μπορούμε να σκεφτούμε το arr να ενεργεί σαν δείκτης.

  2. Ομοίως, χρησιμοποιήσαμε στη συνέχεια forβρόχο για να εμφανίσουμε τις τιμές του arr χρησιμοποιώντας τη σημειογραφία του δείκτη.

     cout << *(arr + i) << endl ;

    Αυτός ο κωδικός είναι ισοδύναμος με

     cout << arr(i) << endl ;

ενδιαφέροντα άρθρα...