Customize Consent Preferences

We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.

The cookies that are categorized as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... 

Always Active

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No cookies to display.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

No cookies to display.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

No cookies to display.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

No cookies to display.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

No cookies to display.

4.4 Πρόσβαση σε διεύθυνση μνήμης στην γλώσσα C

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

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

Για παράδειγμα, αν έχουμε μια μεταβλητή με όνομα “x”, μπορούμε να δηλώσουμε έναν δείκτη που δείχνει στη διεύθυνση μνήμης της “x” ως εξής:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
int x = 5;
int *ptr; // Δήλωση δείκτη
ptr = &x; // Ανάθεση της διεύθυνσης μνήμης της "x" στον δείκτη
int x = 5; int *ptr; // Δήλωση δείκτη ptr = &x; // Ανάθεση της διεύθυνσης μνήμης της "x" στον δείκτη
int x = 5;
int *ptr;  // Δήλωση δείκτη
ptr = &x;  // Ανάθεση της διεύθυνσης μνήμης της "x" στον δείκτη

Έπειτα, μπορούμε να αποκτήσουμε πρόσβαση στην τιμή της “x” από τον δείκτη με τη χρήση του τελεστή αποκατάστασης (*):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
int value = *ptr; // Απόκτηση της τιμής της "x" από τον δείκτη
int value = *ptr; // Απόκτηση της τιμής της "x" από τον δείκτη
int value = *ptr;  // Απόκτηση της τιμής της "x" από τον δείκτη

Με τη χρήση δεικτών, μπορ

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

Παράδειγμα

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <stdio.h>
int main() {
int num = 10; // Δήλωση μεταβλητής num με τιμή 10
printf("The memory address of variable num is: %p", &num); // Εκτύπωση της διεύθυνσης μνήμης της μεταβλητής num
return 0;
}
#include <stdio.h> int main() { int num = 10; // Δήλωση μεταβλητής num με τιμή 10 printf("The memory address of variable num is: %p", &num); // Εκτύπωση της διεύθυνσης μνήμης της μεταβλητής num return 0; }
#include <stdio.h>

int main() {
    int num = 10; // Δήλωση μεταβλητής num με τιμή 10

    printf("The memory address of variable num is: %p", &num); // Εκτύπωση της διεύθυνσης μνήμης της μεταβλητής num

    return 0;
}

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

  1. Η γραμμή #include <stdio.h> εισάγει τη βιβλιοθήκη stdio.h, η οποία περιέχει τη συνάρτηση printf.
  2. Η συνάρτηση main είναι η κύρια συνάρτηση του προγράμματος και χρησιμοποιείται ως σημείο εκκίνησης.
  3. Η γραμμή int num = 10; δηλώνει μια μεταβλητή num τύπου int και την αρχικοποιεί με την τιμή 10.
  4. Η συνάρτηση printf χρησιμοποιείται για να εκτυπώσει κείμενο στην οθόνη. Συγκεκριμένα, η γραμμή printf("The memory address of variable num is: %p", &num); εκτυπώνει το κείμενο “The memory address of variable num is: ” ακολουθούμενο από τη διεύθυνση μνήμης της μεταβλητής num. Η %p χρησιμοποιείται για τη μορφοποίηση της εκτύπωσης της διεύθυνσης μνήμης.
  5. Τέλος, η συνάρτηση main επιστρέφει την τιμή 0 με την εντολή return 0;, υποδεικνύοντας ότι το πρόγραμμα ολοκληρώθηκε με επιτυχία.

Το παραπάνω πρόγραμμα θα εκτυπώσει κάτι παρόμοιο με το παρακάτω ανάλογα με τη διεύθυνση μνήμης που εκχωρείται στη μεταβλητή num:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
The memory address of variable num is: 0x7fff584c82bc
The memory address of variable num is: 0x7fff584c82bc
The memory address of variable num is: 0x7fff584c82bc

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

Σημείωση: Η διεύθυνση μνήμης είναι σε δεκαεξαδική μορφή (0x ..). Πιθανόν να μην λάβετε το ίδιο αποτέλεσμα στο πρόγραμμά σας, καθώς αυτό εξαρτάται από το πού αποθηκεύεται η μεταβλητή στον υπολογιστή σας.

Πρέπει επίσης να σημειώσετε ότι το &myAge ονομάζεται συχνά “δείκτης” (pointer). Ένας δείκτης αποθηκεύει τη διεύθυνση μνήμης μιας μεταβλητής ως την τιμή του. Για να εκτυπώσουμε τιμές δεικτών, χρησιμοποιούμε το μορφοποιητή μορφής %p.

Θα μάθετε πολύ περισσότερα σχετικά με τους δείκτες στο επόμενο κεφάλαιο.

20 Ιουνίου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων