cpp:pointers
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:pointers [2021/04/27 04:34] – [Δείκτες αμετάβλητου περιεχομένου και δείκτες αμετάβλητης διεύθυνσης (const)] gthanos | cpp:pointers [2023/04/25 13:14] (current) – [Δείκτες null] gthanos | ||
---|---|---|---|
Line 86: | Line 86: | ||
Θα πρέπει να έχετε υπόψη ότι όλοι οι δείκτες καταλαμβάνουν τον ίδιο χώρο στη μνήμη (4-byte για συστήματα 32-bit και 8-byte για συστήματα 64-bit) ανεξάρτητα από τον τύπο δεδομένων στον οποίο δείχνουν. | Θα πρέπει να έχετε υπόψη ότι όλοι οι δείκτες καταλαμβάνουν τον ίδιο χώρο στη μνήμη (4-byte για συστήματα 32-bit και 8-byte για συστήματα 64-bit) ανεξάρτητα από τον τύπο δεδομένων στον οποίο δείχνουν. | ||
+ | |||
===== Δείκτες και πίνακες ===== | ===== Δείκτες και πίνακες ===== | ||
Line 133: | Line 134: | ||
*ptr = 10; | *ptr = 10; | ||
} | } | ||
- | </ | ||
- | </ | ||
- | |||
- | ===== Δείκτες αμετάβλητου περιεχομένου ===== | ||
- | |||
- | Είδαμε ότι οι δείκτες είναι μεταβλητές που περιέχουν διευθύνσεις μνήμης στις οποίες αποθηκεύονται άλλες μεταβλητές. Μέσω των δεικτών μπορούμε να διαβάσουμε και να γράψουμε το περιεχόμενο μία διεύθυνσης μνήμης. Υπάρχουν όμως περιπτώσεις που ένας δείκτης είναι επιθυμητό να διαβάζει μόνο τα περιεχόμενα των διευθύνσεων μνήμης στα οποία δείχνει χωρίς να μπορεί να τα μεταβάλλει. Σε αυτή την περίπτωση αρκεί να δηλώσετε τον τύπο δεδομένων στον οποίο δείχνει ο δείκτης ως //const// ως εξής: | ||
- | |||
- | <code c> | ||
- | int x; | ||
- | int y = 10; | ||
- | const int * p = &y; | ||
- | x = *p; // μπορείτε να διαβάσετε το περιεχόμενο του δείκτη | ||
- | *p = x; // error: ΔΕΝ μπορείτε να μεταβάλλετε το περιεχόμενο του δείκτη. | ||
- | </ | ||
- | |||
- | Η χρήση δεικτών σε δεδομένα τύπου //const// είναι ευρέως διαδεδομένη σε συναρτήσεις, | ||
- | |||
- | <code c const_content.cpp> | ||
- | #include < | ||
- | using namespace std; | ||
- | |||
- | // stop pointer does not modify its contents | ||
- | void increment_all (int* start, const int* stop) { | ||
- | while (start != stop) { | ||
- | ++(*start); | ||
- | ++start; | ||
- | } | ||
- | } | ||
- | |||
- | // start & stop pointers do not modify their contents | ||
- | void print_all (const int* start, const int* stop) | ||
- | { | ||
- | while (start != stop) { | ||
- | cout << *start << endl; | ||
- | ++start; | ||
- | } | ||
- | } | ||
- | |||
- | int main () | ||
- | { | ||
- | int numbers[] = {10,20,30}; | ||
- | increment_all (numbers, | ||
- | print_all (numbers, | ||
- | return 0; | ||
- | } | ||
- | </ | ||
- | |||
- | Από τον παραπάνω παράδειγμα παρατηρήστε ότι ο δείκτης //start// στη συνάρτηση // | ||
- | |||
- | ===== Δείκτες αμετάβλητης διεύθυνσης ===== | ||
- | |||
- | Υπάρχουν περιπτώσεις που είναι επιθυμητή η χρήση δεικτών που δεν μεταβάλλουν τη διεύθυνση στην οποία δείχνουν, | ||
- | |||
- | <code c> | ||
- | char c = ' | ||
- | char * const ptr = &c; | ||
- | </ | ||
- | |||
- | Το παρακάτω παράδειγμα είναι ενδεικτικό της χρήσης ενός τέτοιου δείκτη | ||
- | |||
- | <code c const_address.cpp> | ||
- | #include < | ||
- | typedef struct { | ||
- | char name[32]; | ||
- | char age; | ||
- | } person_t; | ||
- | |||
- | void set_age(person_t * const p, int age) { | ||
- | p->age = age; // this is OK | ||
- | // | ||
- | } | ||
- | |||
- | int main() { | ||
- | person_t peter; | ||
- | strcpy(peter.name, | ||
- | set_age(& | ||
- | } | ||
- | </ | ||
- | |||
- | ===== Δείκτες αμετάβλητης διεύθυνσης και αμετάβλητου περιεχομένου ===== | ||
- | |||
- | Στην περίπτωση που είναι επιθυμητή η χρήση ενός δείκτη που δεν μεταβάλλει τη διεύθυνση στην οποία δείχνει ούτε το περιεχόμενο της, τότε μπορείτε να δηλώσετε τον δείκτη ως εξής: | ||
- | |||
- | <code c>char c = ' | ||
- | |||
- | Δείτε το παρακάτω παράδειγμα χρήσης ενός τέτοιου δείκτη | ||
- | |||
- | <code c const_address_const_ptr.cpp> | ||
- | #include < | ||
- | #include < | ||
- | using namespace std; | ||
- | |||
- | typedef struct { | ||
- | char name[32]; | ||
- | char age; | ||
- | } person_t; | ||
- | |||
- | void set_age(person_t * const p, int age) { | ||
- | p->age = age; // this is OK | ||
- | // | ||
- | } | ||
- | |||
- | int get_age(const person_t * const p) { | ||
- | // | ||
- | // | ||
- | return p-> | ||
- | } | ||
- | |||
- | int main() { | ||
- | person_t peter; | ||
- | strcpy(peter.name, | ||
- | set_age(& | ||
- | std::cout << "Age of" << peter.name << " is " << get_age(& | ||
- | } | ||
- | </ | ||
- | |||
- | |||
- | <WRAP center round tip 80%> | ||
- | Συμπερασματικά, | ||
- | <code c> | ||
- | int x; | ||
- | int * p1 = & | ||
- | const int * p2 = & | ||
- | int * const p3 = & | ||
- | const int * const p4 = & | ||
</ | </ | ||
</ | </ | ||
Line 293: | Line 169: | ||
{{ : | {{ : | ||
+ | |||
===== Δείκτες τύπου void ===== | ===== Δείκτες τύπου void ===== | ||
- | Ο δείκτης τύπου //void// είναι ένας ειδικός τύπος δείκτη ο οποίος έχει το πλεονέκτημα ότι μπορεί να μετατραπεί σε οποιονδήποτε τύπο δείκτη. Επίσης οποιοσδήποτε τύπος δείκτη μπορεί να μετατραπεί σε δείκτη τύπου //void//. Ο περιορισμός των δεικτών τύπου void είναι ότι δεν υπάρχει τρόπος να προσπελάσουμε το περιεχόμενο | + | Ο δείκτης τύπου //void// είναι ένας ειδικός τύπος δείκτη ο οποίος έχει το πλεονέκτημα ότι μπορεί να μετατραπεί σε οποιονδήποτε τύπο δείκτη. Επίσης οποιοσδήποτε τύπος δείκτη μπορεί να μετατραπεί σε δείκτη τύπου //void//. Ο περιορισμός των δεικτών τύπου void είναι ότι δεν υπάρχει τρόπος να προσπελάσουμε |
<code c void_ptr.cpp> | <code c void_ptr.cpp> | ||
Line 323: | Line 200: | ||
<WRAP center round tip 80%> | <WRAP center round tip 80%> | ||
- | Δεν | + | Δεν |
</ | </ | ||
- | ===== null pointers | + | ===== Δείκτες με τιμή NULL ===== |
Δείκτες που δεν είναι αρχικοποιημένοι συχνά αρχικοποιούνται στην τιμή 0 ή NULL. Η C++ εκτός από τις τιμές 0 και null παρέχει και την δεσμευμένη λέξη **nullptr** που αντιπροσωπεύει και αυτή την τιμή 0 για ένα δείκτη. Οι παρακάτω ορισμοί είναι ισοδύναμοι. | Δείκτες που δεν είναι αρχικοποιημένοι συχνά αρχικοποιούνται στην τιμή 0 ή NULL. Η C++ εκτός από τις τιμές 0 και null παρέχει και την δεσμευμένη λέξη **nullptr** που αντιπροσωπεύει και αυτή την τιμή 0 για ένα δείκτη. Οι παρακάτω ορισμοί είναι ισοδύναμοι. | ||
Line 332: | Line 209: | ||
<code c++ nullptr.cpp> | <code c++ nullptr.cpp> | ||
#include < | #include < | ||
+ | |||
char *p = 0; | char *p = 0; | ||
char *q = NULL; | char *q = NULL; |
cpp/pointers.txt · Last modified: 2023/04/25 13:14 by gthanos