C Pointers (με παραδείγματα)

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

Οι δείκτες είναι ισχυρά χαρακτηριστικά του προγραμματισμού C και C ++. Πριν μάθουμε δείκτες, ας μάθουμε για τις διευθύνσεις στον προγραμματισμό Γ.

Διεύθυνση σε C

Εάν έχετε μια μεταβλητή var στο πρόγραμμά σας, &varθα σας δώσει τη διεύθυνση στη μνήμη.

Έχουμε χρησιμοποιήσει τη διεύθυνση πολλές φορές κατά τη χρήση της scanf()συνάρτησης.

 scanf("%d", &var);

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

 #include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; ) 

Παραγωγή

 var: 5 διεύθυνση var: 2686778

Σημείωση: Πιθανότατα θα λάβετε μια διαφορετική διεύθυνση όταν εκτελείτε τον παραπάνω κωδικό.

C Δείκτες

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

Σύνταξη δείκτη

Να πώς μπορούμε να δηλώσουμε δείκτες.

 int* p;

Εδώ, δηλώσαμε έναν δείκτη p intτύπου.

Μπορείτε επίσης να δηλώσετε δείκτες με αυτούς τους τρόπους.

 int *p1; int * p2; 

Ας πάρουμε ένα άλλο παράδειγμα δήλωσης δεικτών.

 int* p1, p2;

Εδώ, έχουμε δηλώσει έναν δείκτη p1 και μια κανονική μεταβλητή p2.

Εκχώρηση διευθύνσεων σε δείκτες

Ας πάρουμε ένα παράδειγμα.

 int* pc, c; c = 5; pc = &c; 

Εδώ, το 5 αντιστοιχεί στη μεταβλητή c. Και, η διεύθυνση του c αντιστοιχεί στον δείκτη του υπολογιστή.

Λάβετε την αξία των σημείων από τους δείκτες

Για να πάρουμε την αξία του σημείου που δείχνουν οι δείκτες, χρησιμοποιούμε τον *τελεστή. Για παράδειγμα:

 int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5

Εδώ, η διεύθυνση του cαντιστοιχεί στον δείκτη του υπολογιστή. Για να αποθηκεύσουμε την τιμή σε αυτήν τη διεύθυνση, χρησιμοποιήσαμε * υπολογιστή.

Σημείωση: Στο παραπάνω παράδειγμα, ο υπολογιστής είναι δείκτης, όχι *pc. Δεν μπορείτε και δεν πρέπει να κάνετε κάτι σαν *pc = &c?

Παρεμπιπτόντως, *ονομάζεται τελεστής διαφοράς (όταν εργάζεστε με δείκτες). Λειτουργεί σε ένα δείκτη και δίνει την τιμή που είναι αποθηκευμένη σε αυτόν το δείκτη.

Αλλαγή τιμής που υποδεικνύεται από δείκτες

Ας πάρουμε ένα παράδειγμα.

 int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1

Έχουμε εκχωρήσει τη διεύθυνση του c στο δείκτη του υπολογιστή

Στη συνέχεια, αλλάξαμε την τιμή του c σε 1. Δεδομένου ότι ο υπολογιστής και η διεύθυνση του c είναι η ίδια, *pcμας δίνει 1.

Ας πάρουμε ένα άλλο παράδειγμα.

 int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1 

Έχουμε εκχωρήσει τη διεύθυνση του c στο δείκτη του υπολογιστή

Στη συνέχεια, αλλάξαμε *pcσε 1 χρησιμοποιώντας *pc = 1;. Δεδομένου ότι ο υπολογιστής και η διεύθυνση του c είναι η ίδια, το c θα είναι ίσο με 1.

Ας πάρουμε ένα ακόμη παράδειγμα.

 int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15

Αρχικά, η διεύθυνση του c αντιστοιχεί στον υπολογιστή δείκτη χρησιμοποιώντας pc = &c;. Εφόσον το c είναι 5, *pcμας δίνει 5.

Στη συνέχεια, η διεύθυνση του d αντιστοιχεί στον υπολογιστή δείκτη χρησιμοποιώντας pc = &d;. Δεδομένου ότι το d είναι -15, *pcμας δίνει -15.

Παράδειγμα: Εργασία δεικτών

Ας πάρουμε ένα λειτουργικό παράδειγμα.

 #include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; ) 

Παραγωγή

 Διεύθυνση c: 2686784 Τιμή c: 22 Διεύθυνση pc δείκτη: 2686784 Περιεχόμενο pc δείκτη: 22 Διεύθυνση pc δείκτη: 2686784 Περιεχόμενο pc δείκτη: 11 Διεύθυνση c: 2686784 Τιμή c: 2 

Επεξήγηση του προγράμματος

  1. int* pc, c;

    Εδώ, δημιουργείται ένας δείκτης pc και μια κανονική μεταβλητή c, και οι δύο του τύπου int.
    Δεδομένου ότι τα pc και c δεν αρχικοποιούνται αρχικά, ο δείκτης pc δείχνει είτε καμία διεύθυνση είτε μια τυχαία διεύθυνση. Και, η μεταβλητή c έχει διεύθυνση αλλά περιέχει τυχαία τιμή απορριμμάτων.
  2. c = 22;

    Αυτό εκχωρεί 22 στη μεταβλητή c. Δηλαδή, το 22 αποθηκεύεται στη θέση μνήμης της μεταβλητής c.
  3. pc = &c;

    Αυτό εκχωρεί τη διεύθυνση της μεταβλητής c στον υπολογιστή δείκτη.
  4. c = 11;

    Αυτό εκχωρεί 11 στη μεταβλητή c.
  5. *pc = 2;

    Αυτό αλλάζει την τιμή στη θέση μνήμης που δείχνει ο υπολογιστής δείκτη σε 2.

Συνηθισμένα λάθη όταν εργάζεστε με δείκτες

Ας υποθέσουμε ότι θέλετε ο υπολογιστής δείκτη να δείχνει στη διεύθυνση του c. Τότε,

 int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;

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

 #include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )

Γιατί δεν παρουσιάστηκε σφάλμα κατά τη χρήση int *p = &c;;

Είναι επειδή

 int *p = &c;

είναι ισοδύναμο με

 int *p: p = &c;

Και στις δύο περιπτώσεις, δημιουργούμε έναν δείκτη p(όχι *p) και του αναθέτουμε &c.

Για να αποφευχθεί αυτή η σύγχυση, μπορούμε να χρησιμοποιήσουμε τη δήλωση ως εξής:

 int* p = &c;

Τώρα ξέρετε τι είναι οι δείκτες, θα μάθετε πώς σχετίζονται οι δείκτες με πίνακες στο επόμενο σεμινάριο.

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