Δείκτες στην γλώσσα προγραμματισμού C

Δείκτες στην γλώσσα προγραμματισμού C

Εισαγωγή στους Δείκτες (Pointers)

Με χρήστη του τελεστή & μπορούμε να βρούμε τη διεύθυνση μιας μεταβλητής, π.χ. της μεταβλητής p. Η &p δηλαδή είναι ένας δείκτης της p. Η πραγματική διεύθυνση είναι ένας 16δικός αριθμός και η συμβολική παράσταση &p είναι μια σταθερά δείκτη. Η μεταβλητή p δεν πρόκειται να αλλάξει διεύθυνση μέσα στο πρόγραμμα, αν και μπορεί να αλλάξει τιμή.

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

Ακολουθούν παραδείγματα:

int main(){
int* ptr;           /* μεταβλητή-δείκτης ptr σε integer*/
int p = 12;
int b = 14;
...
ptr = &p;       /* καταχωρεί τη διεύθυνση της p στην μεταβλητή-δείκτη ptr */
...
ptr = &b;       /* η μεταβλητή-δείκτης ptr δείχνει τώρα στην μεταβλήτη b αντί για την p */
...
return 0;
}

Η ptr δηλαδή είναι μια μεταβλητή και η &p είναι μια σταθερά.

Για να δηλώσουμε τον τύπο μιας μεταβλητής δείκτη, πρέπει να χρησιμοποιήσουμε τον τελεστή έμμεσης αναφοράς (*).

int main(){
int* ptr;           /* μεταβλητή-δείκτης ptr σε integer*/
int p = 12;
int val;
...
ptr = &p;       /* καταχωρεί τη διεύθυνση της p στην μεταβλητή-δείκτη ptr */
val = *ptr          /* βρίσκει την τιμή που δείχνει ο δείκτης ptr - Τώρα η val θα έχει την τιμή 12 (=p) */
...
return 0;
}

Πώς δηλώνουμε όμως, τους δείκτες;

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

Οι δείκτες δηλώνονται ως εξής :

int main(){
int *pi;                       /* pi είναι ένας δείκτης σε μια ακέραια μεταβλητή */
char *pc;                      /* pc είναι ένας δείκτης σε μια μεταβλητή χαρακτήρα */
float *pf, *pg;                /* pf, pg είναι δείκτες σε μεταβλητές float */
...
return 0;
}

Από τα παραπάνω συμπεραίνουμε ότι pi είναι ο δείκτης και ότι η *pi είναι τύπου int. Παρόμοια, η τιμή *pc την οποία δείχνει ο pc είναι τύπου char.

Οι Λειτουργίες των Δεικτών

Η C έχει πέντε βασικές λειτουργίες δεικτών. Ακολουθεί ένα παράδειγμα:

#include 
main(){
            static int pina[3] = {100, 200, 300};
            int *ptr1, *ptr2;

            ptr1 = pina;                 /* καταχώρηση της διεύθυνσης του πίνακα σ' έναν δείκτη */
            ptr2 = &pina[2];             /* καταχώρηση της διεύθυνσης του 3ου στοιχείου */

            printf("ptr1 = %u, *ptr1 = %d, &ptr1 = %u\n", ptr1, *ptr1, &ptr1);

            ptr1++;                      /* αυξάνουμε τον δείκτη */
            printf("ptr1 = %u, *ptr1 = %d, &ptr1 = %u\n", ptr1, *ptr1, &ptr1);

            printf("ptr2 = %u, *ptr2 = %d, &ptr2 = %u\n", ptr2, *ptr2, &ptr2);

            ++ptr2;                      /* περνάμε τα όρια του πίνακα */
            printf("ptr2 = %u, *ptr2 = %d, &ptr2 = %u\n", ptr2, *ptr2, &ptr2);

                                         /* τυπώνουμε τη διαφορά των δεικτών */
            printf("ptr2 - ptr1 = %u\n", ptr2 - ptr1); 
...
return (0);    

}

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

  1. Καταχώρηση. Μπορούμε να καταχωρήσουμε μια διεύθυνση σ’ έναν δείκτη, είτε χρησιμοποιώντας ένα όνομα πίνακα ή χρησιμοποιώντας τον τελεστή διεύθυνσης & και την τιμή μιας μεταβλητής.
  2. Εύρεση τιμής. Ο τελεστής * μάς δίνει την τιμή που βρίσκεται αποθηκευμένη στη θέση που δείχνεται από τον δείκτη.
  3. Απόκτηση της διεύθυνσης ενός δείκτη. Και οι μεταβλητές δείκτη έχουν μια διεύθυνση και μια τιμή.
  4. Αύξηση-μείωση ενός δείκτη. Με την αύξησή του ένας δείκτης μετακινείται στο επόμενο στοιχείο του πίνακα. Φυσικά, με ανάλογο τρόπο μπορούμε και να μειώσουμε έναν δείκτη. Η λειτουργία, όμως, ++ptr2 στο προηγούμενο παράδειγμα είχε σαν αποτέλεσμα ο ptr2 να μετακινηθεί κατά δύο bytes και να δείχνει ο,τιδήποτε μπορεί να αποθηκευθεί μετά τον πίνακα. Επίσης, πρέπει να θυμόμαστε ότι μπορούμε να χρησιμοποιούμε τους τελεστές αύξησης ή μείωσης με τις μεταβλητές δείκτη, αλλά όχι με σταθερές δείκτη. Δηλαδή, το ptr2 = urn++; δεν επιτρέπεται, όπως δεν επιτρέπεται και το 3++.
  5. Διαφορά. Μπορούμε να βρούμε τη διαφορά μεταξύ δύο δεικτών.

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

Απάντηση

Αυτός ο ιστότοπος χρησιμοποιεί το Akismet για να μειώσει τα ανεπιθύμητα σχόλια. Μάθετε πώς υφίστανται επεξεργασία τα δεδομένα των σχολίων σας.