This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
cpp:pointers [2021/04/27 03:59] gthanos [Αριθμητική δεικτών] |
cpp:pointers [2021/04/27 04:42] gthanos [null pointers] |
||
|---|---|---|---|
| Line 84: | Line 84: | ||
| - η μεταβλητή myshort μετακινείται κατά // | - η μεταβλητή myshort μετακινείται κατά // | ||
| - η μεταβλητή myint μετακινείται κατά // | - η μεταβλητή myint μετακινείται κατά // | ||
| + | |||
| + | Θα πρέπει να έχετε υπόψη ότι όλοι οι δείκτες καταλαμβάνουν τον ίδιο χώρο στη μνήμη (4-byte για συστήματα 32-bit και 8-byte για συστήματα 64-bit) ανεξάρτητα από τον τύπο δεδομένων στον οποίο δείχνουν. | ||
| ===== Δείκτες και πίνακες ===== | ===== Δείκτες και πίνακες ===== | ||
| - | Η δήλωση ενός πίνακα ισοδυναμεί με ένα δείκτη στην πρώτη θέση του πίνακα. | + | Η δήλωση ενός πίνακα ισοδυναμεί με ένα δείκτη |
| <code c> | <code c> | ||
| Line 93: | Line 95: | ||
| </ | </ | ||
| - | Αν και ένας πίνακας μπορεί να αντιμετωπιστεί και ως δείκτης η βασική διαφορά πινάκων και δεικτών είναι ότι ο πίνακας δεν μπορεί να μεταβάλλει την διεύθυνση στην οποία δείχνει, | + | Αν και ένας πίνακας μπορεί να αντιμετωπιστεί και ως δείκτης η βασική διαφορά πινάκων και δεικτών είναι ότι ο πίνακας δεν μπορεί να μεταβάλλει την διεύθυνση στην οποία δείχνει, |
| - | <code c> | + | |
| - | Δείτε το παρακάτω παράδειγμα όπου χρησιμοποιούνται πίνακας από ακεραίους και ένας δείκτης σε ακέραιο που δείχνει στις επιμέρους τιμές του πίνακα. | + | <code c> |
| + | |||
| + | Δείτε το παρακάτω παράδειγμα όπου χρησιμοποιούνται πίνακας από ακεραίους και ένας δείκτης σε ακέραιο που δείχνει στις επιμέρους τιμές του πίνακα. | ||
| <code cpp pointers-arrays.cpp> | <code cpp pointers-arrays.cpp> | ||
| Line 106: | Line 109: | ||
| int numbers[5]; | int numbers[5]; | ||
| int * p; | int * p; | ||
| - | p = numbers; | + | p = numbers; |
| - | p++; *p = 20; // numbers[1] | + | p++; *p = 20; // numbers[1] |
| - | p = & | + | p = & |
| - | p = numbers + 3; *p = 40; // numbers[3] | + | p = numbers + 3; *p = 40; // numbers[3] |
| - | p = numbers; | + | p = numbers; |
| + | | ||
| for (int n=0; n<5; n++) | for (int n=0; n<5; n++) | ||
| cout << numbers[n] << ", "; | cout << numbers[n] << ", "; | ||
| Line 119: | Line 123: | ||
| <WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
| - | Οι δείκτες οφείλουν να δείχνουν σε διευθύνσεις μνήμης που ανήκουν στην διεργασία που εκτελείται. Στην πραγματικότητα όμως οι δείκτες μπορούν να πάρουν οποιαδήποτε τιμή ακόμη και τιμές εκτός των ορίων της | + | Οι δείκτες οφείλουν να δείχνουν σε διευθύνσεις μνήμης που ανήκουν στη διεργασία που εκτελείται. Στην πραγματικότητα όμως οι δείκτες μπορούν να πάρουν οποιαδήποτε τιμή ακόμη και τιμές εκτός του εύρους διευθύνσεων που έχουν ανατεθεί από το λειτουργικό |
| <code c++ intArrayPointer.cpp> | <code c++ intArrayPointer.cpp> | ||
| #include < | #include < | ||
| Line 131: | Line 136: | ||
| </ | </ | ||
| - | ===== Δείκτες αμετάβλητου περιεχομένου | + | ===== Δείκτες αμετάβλητου περιεχομένου ===== |
| Είδαμε ότι οι δείκτες είναι μεταβλητές που περιέχουν διευθύνσεις μνήμης στις οποίες αποθηκεύονται άλλες μεταβλητές. Μέσω των δεικτών μπορούμε να διαβάσουμε και να γράψουμε το περιεχόμενο μία διεύθυνσης μνήμης. Υπάρχουν όμως περιπτώσεις που ένας δείκτης είναι επιθυμητό να διαβάζει μόνο τα περιεχόμενα των διευθύνσεων μνήμης στα οποία δείχνει χωρίς να μπορεί να τα μεταβάλλει. Σε αυτή την περίπτωση αρκεί να δηλώσετε τον τύπο δεδομένων στον οποίο δείχνει ο δείκτης ως //const// ως εξής: | Είδαμε ότι οι δείκτες είναι μεταβλητές που περιέχουν διευθύνσεις μνήμης στις οποίες αποθηκεύονται άλλες μεταβλητές. Μέσω των δεικτών μπορούμε να διαβάσουμε και να γράψουμε το περιεχόμενο μία διεύθυνσης μνήμης. Υπάρχουν όμως περιπτώσεις που ένας δείκτης είναι επιθυμητό να διαβάζει μόνο τα περιεχόμενα των διευθύνσεων μνήμης στα οποία δείχνει χωρίς να μπορεί να τα μεταβάλλει. Σε αυτή την περίπτωση αρκεί να δηλώσετε τον τύπο δεδομένων στον οποίο δείχνει ο δείκτης ως //const// ως εξής: | ||
| Line 175: | Line 180: | ||
| </ | </ | ||
| - | Από τον παραπάνω παράδειγμα παρατηρήστε ότι ο δείκτης //start// στη συνάρτηση // | + | Από τον παραπάνω παράδειγμα παρατηρήστε ότι ο δείκτης //start// στη συνάρτηση // |
| + | |||
| + | ===== Δείκτες αμετάβλητης διεύθυνσης ===== | ||
| + | |||
| + | Υπάρχουν περιπτώσεις | ||
| <code c> | <code c> | ||
| Line 182: | Line 191: | ||
| </ | </ | ||
| - | όπως στο παρακάτω παράδειγμα: | + | Το παρακάτω παράδειγμα |
| <code c const_address.cpp> | <code c const_address.cpp> | ||
| Line 203: | Line 212: | ||
| </ | </ | ||
| - | Τέλος εάν επιθυμείτε να έχετε | + | ===== Δείκτες αμετάβλητης διεύθυνσης και αμετάβλητου |
| + | |||
| + | Στην περίπτωση που | ||
| <code c>char c = ' | <code c>char c = ' | ||
| Line 239: | Line 250: | ||
| - | <WRAP center round tip 80%> | + | <WRAP center round tip 95%> |
| Συμπερασματικά, | Συμπερασματικά, | ||
| <code c> | <code c> | ||
| int x; | int x; | ||
| - | int * p1 = & | + | int * p1 = & |
| - | const int * p2 = & | + | const int * p2 = & |
| - | int * const p3 = & | + | int * const p3 = & |
| - | const int * const p4 = & | + | const int * const p4 = & |
| </ | </ | ||
| </ | </ | ||
| Line 284: | Line 295: | ||
| ===== Δείκτες τύπου void ===== | ===== Δείκτες τύπου void ===== | ||
| - | Ο δείκτης τύπου //void// είναι ένας ειδικός τύπος δείκτη ο οποίος έχει το πλεονέκτημα ότι μπορεί να μετατραπεί σε οποιονδήποτε τύπο δείκτη. Επίσης οποιοσδήποτε τύπος δείκτη μπορεί να μετατραπεί σε δείκτη τύπου //void//. Ο περιορισμός των δεικτών τύπου void είναι ότι δεν υπάρχει τρόπος να προσπελάσουμε το περιεχόμενο | + | Ο δείκτης τύπου //void// είναι ένας ειδικός τύπος δείκτη ο οποίος έχει το πλεονέκτημα ότι μπορεί να μετατραπεί σε οποιονδήποτε τύπο δείκτη. Επίσης οποιοσδήποτε τύπος δείκτη μπορεί να μετατραπεί σε δείκτη τύπου //void//. Ο περιορισμός των δεικτών τύπου void είναι ότι δεν υπάρχει τρόπος να προσπελάσουμε |
| <code c void_ptr.cpp> | <code c void_ptr.cpp> | ||
| Line 312: | Line 323: | ||
| <WRAP center round tip 80%> | <WRAP center round tip 80%> | ||
| - | Δεν | + | Δεν |
| </ | </ | ||
| Line 321: | Line 332: | ||
| <code c++ nullptr.cpp> | <code c++ nullptr.cpp> | ||
| #include < | #include < | ||
| + | |||
| char *p = 0; | char *p = 0; | ||
| char *q = NULL; | char *q = NULL; | ||