Οι δείκτες είναι ζωτικής σημασίας για πολλά προγράμματα C, αλλά μπορεί να είναι δύσκολο να κατανοηθούν. Εξετάστε τη σύνταξή τους και πώς λειτουργούν με πρακτικά παραδείγματα.

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

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

Μνήμη και Διευθύνσεις

Μνήμη—συχνά χρησιμοποιείται ως συντομογραφία RAM (Μνήμη τυχαίας πρόσβασης)— είναι ο χώρος αποθήκευσης σε έναν υπολογιστή που περιέχει τα δεδομένα και τις οδηγίες που χρειάζεται ένα πρόγραμμα για να εκτελεστεί. Λειτουργεί ως χώρος εργασίας για το πρόγραμμά σας. Η μικρότερη μονάδα μνήμης είναι συνήθως ένα byte, το οποίο ισούται με οκτώ bit.

instagram viewer

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

Φανταστείτε τη μνήμη του υπολογιστή σας ως μια ακολουθία κελιών αποθήκευσης, που το καθένα περιέχει ένα byte δεδομένων. Ας πούμε ότι υπάρχουν δύο μεταβλητές, Χ και y, σε πρόγραμμα C:

int x = 5;
int y = 10;

Στη μνήμη, μπορεί να μοιάζει με αυτό:

Διεύθυνση

Δεδομένα

1000

5

1004

10

Εδώ, χωριστές θέσεις μνήμης αποθηκεύουν αυτές τις μεταβλητές. Τα δεδομένα που Χ αντιπροσωπεύει βρίσκεται στη διεύθυνση μνήμης 1000, ενώ yΤα δεδομένα του καταλαμβάνουν τη διεύθυνση μνήμης 1004.

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

Δήλωση και αρχικοποίηση δεικτών στο C

Για να μπορέσετε να τροποποιήσετε δεδομένα χρησιμοποιώντας δείκτες στο C, πρέπει να τα δηλώσετε και να τα αρχικοποιήσετε.

Δήλωση

Για να δηλώσετε έναν δείκτη, καθορίζετε τον τύπο δεδομένων στον οποίο δείχνει, ακολουθούμενο από έναν αστερίσκο (*) και μετά το όνομα του δείκτη. Για παράδειγμα:

int *ptr;

Εδώ, int *ptr δηλώνει ένα δείκτη με όνομα πτρ που μπορεί να αποθηκεύσει τη διεύθυνση μνήμης ενός ακέραιου αριθμού.

Αρχικοποίηση

Μετά τη δήλωση, θα πρέπει να την αρχικοποιήσετε με τη διεύθυνση μνήμης στην οποία θα δείχνει. Μπορείτε να το αρχικοποιήσετε ως εξής:

int x = 5;
int *ptr = &x;

Σε αυτή τη δήλωση, το & Ο τελεστής ανακτά τη διεύθυνση της μεταβλητής x. Ο κώδικας ουσιαστικά λέει "Το ptr είναι μια μεταβλητή, αποθηκεύει τη θέση μνήμης μιας ακέραιας τιμής και αυτή η θέση είναι όπου αναφέρεται το x αυτήν τη στιγμή."

Τώρα, πτρ κρατά τη διεύθυνση της ακέραιας μεταβλητής Χ. Για παράδειγμα:

Μεταβλητός

Διεύθυνση

αξία

Χ

1000

5

πτρ

1000

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

Δείκτες αποαναφοράς

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

Ας υποθέσουμε ότι έχετε έναν δείκτη, int *ptr, που δείχνει σε μια ακέραια μεταβλητή και αυτή η μεταβλητή έχει τιμή 10. Για να αποκτήσετε πρόσβαση στην τιμή μέσω του δείκτη, χρησιμοποιήστε τον αστερίσκο (*) χειριστής:

int x = 10;

int *ptr = &x; // ptr points to the address of x

int value = *ptr; // Dereferencing ptr to get the value

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

Αριθμητική δείκτη

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

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

Ξεκινήστε δηλώνοντας έναν πίνακα ακεραίων:

int numbers[] = {10, 20, 30};

Δηλώστε έναν δείκτη σε ένα int και αντιστοιχίστε τη θέση μνήμης του πίνακα αριθμών σε αυτόν:

int *ptr = numbers;

Δεν χρειάζεται να χρησιμοποιήσετε τον τελεστή "&" εδώ επειδή οι αριθμοί είναι ήδη, σιωπηρά, ένας τύπος δείκτη.

Η μεταβλητή ptr δείχνει τώρα το πρώτο στοιχείο του πίνακα:

printf("%d\n", *ptr); // 10

Μπορείτε να μετακινήσετε τον δείκτη στο τρίτο στοιχείο του πίνακα αυξάνοντάς τον κατά 2:

ptr += 2;
printf("%d\n", *ptr); // 30

Μπορείτε να μετακινήσετε τον δείκτη προς τα πίσω αφαιρώντας από αυτόν:

ptr--;
printf("%d\n", *ptr); ;// 20

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

Δείκτες και συναρτήσεις στο C

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

Δείκτες συνάρτησης

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

int (*operation)(int, int); // Declare a function pointer
operation = add; // Pointer to an add function
int result = operation(5, 3); // Call the function through the pointer

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

Περνώντας από Αναφορά

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

voidmodifyValue(int *x){
*x = 42; // Modifies the value of x in the calling code
}

ο modifyValue Η συνάρτηση αλλάζει την τιμή οποιουδήποτε ορίσματος της παρέχει ο κωδικός κλήσης, ορίζοντας το σε 42.

Δυναμική εκχώρηση μνήμης

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

int *createArray(intsize){
int *arr = (int *)malloc(size * sizeof(int));
return arr;
}

Αυτός ο κώδικας ορίζει μια συνάρτηση, createArray, που παίρνει έναν ακέραιο αριθμό, Μέγεθος, ως είσοδος. Μέσα στη συνάρτηση, εκχωρεί δυναμικά μνήμη για έναν ακέραιο πίνακα του καθορισμένου μεγέθους χρησιμοποιώντας malloc. Μετά την προετοιμασία του πίνακα, επιστρέφει έναν δείκτη σε αυτόν τον νέο πίνακα.

Κοινές Χρήσεις

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

  • Δυναμική εκχώρηση μνήμης
  • Χειρισμός Πίνακας
  • Περνώντας από Αναφορά
  • ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ
  • Διαχείριση πόρων

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

Εξάσκηση στη χρήση δεικτών στον προγραμματισμό C

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