Προγραμματισμός Ι (ΗΥ120)

Σχετικά έγγραφα
Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

Στοιχειώδης προγραμματισμός σε C++

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Προγραμματισμός Ι (HY120)

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Ι (ΗΥ120)

Δομημένος Προγραμματισμός (ΤΛ1006)

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι περιλαμβάνει μια μεταβλητή; ΔΕΙΚΤΕΣ. Διεύθυνση μεταβλητής. Δείκτης

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Διαδικασιακός Προγραμματισμός

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Διαδικασιακός Προγραμματισμός

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Η/Υ (ΤΛ2007 )

Η γλώσσα προγραμματισμού C

Προγραμματισμός Ι (ΗΥ120)

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διαδικασιακός Προγραμματισμός

3. Εκφράσεις και έλεγχος ροής

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Προγραμματισμός Ι (HY120)

Εισαγωγή στον δομημένο προγραμματισμό

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

Προγραμματισμός Ι (ΗΥ120)

10 η Διάλεξη C++ - Πίνακες. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Εισαγωγή στον Προγραμματισμό με C++

Δομημένος Προγραμματισμός

Προγραμματισμός Ι (HY120)

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τύποι δεδομένων ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΠΡΑΞΕΙΣ ΜΕΤΑΒΛΗΤΕΣ. Ακέραιοι αριθμοί (int) Πράξεις μεταξύ ακεραίων αριθμών

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Πληροφορική 2. Γλώσσες Προγραμματισμού

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 9 Ο. Διαχείριση αλφαριθμητικών και πράξεις σε επίπεδο bit ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΙΝΑΤΚΑΣ Ι.

Προγραμματισμός ΙI (Θ)

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματισμός Ι (ΗΥ120)

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Προγραμματισμός Η/Υ. Ενότητα 6: Πίνακες και Δείκτες

Εισαγωγή στη γλώσσα προγραμματισμού C++

Η γλώσσα προγραμματισμού C

Διδάσκων: Παναγιώτης Ανδρέου

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δείκτες Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Διδάσκων: Παναγιώτης Ανδρέου

Διαδικασιακός Προγραμματισμός

Γλώσσα Προγραμματισμού C

Διαδικασιακός Προγραμματισμός

Διάλεξη 5: Δείκτες και Συναρτήσεις

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Ανάπτυξη και Σχεδίαση Λογισμικού

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραµµατισµός Ι (ΗΥ120)

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Τύποι δεδομένων, μεταβλητές, πράξεις. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

5ο σετ σημειώσεων - Δείκτες

5 &6. Τύποι δεδομένων, τελεστές και

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

'Ασκηση 1: Στατικός Κατακερματισμός. Εισαγωγή. Ρουτίνες υλοποίησης κατακερματισμού. (Ημερομηνία Παράδοσης: Παρασκευή, 16/5/2008, 5μμ) HT_Init()

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

Προγραμματισμός Ι. Δομές & Ενώσεις. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Ανάπτυξη και Σχεδίαση Λογισμικού

Διάλεξη 11η: Δείκτες, μέρος 1

Οντοκεντρικός Προγραμματισμός

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Υπολογιστών με C++

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

Οντοκεντρικός Προγραμματισμός

Τύποι δεδομένων, τελεστές, μεταβλητές

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγή στον Προγραμματισμό

Transcript:

Προγραμματισμός Ι (ΗΥ120) Διάλεξη 10: Δείκτες

Δείκτες Υπάρχουν περιπτώσεις που δεν ενδιαφέρει το περιεχόμενο αλλά η μιας μεταβλητής. Χρειάζεται κατάλληλος μηχανισμός αναφοράς και επεξεργασίας τιμών που είναι διευθύνσεις μνήμης. Υπάρχουν μεταβλητές ειδικού τύπου: δείκτες. Μια μεταβλητή δείκτης μπορεί να χρησιμοποιηθεί για την αποθήκευση μιας ακέραιας τιμής που ερμηνεύεται σαν μνήμης. Μέσω μιας μεταβλητής δείκτη μπορούμε να διαβάσουμε και να αλλάξουμε την τιμή που βρίσκεται αποθηκευμένη στην που αυτή περιέχει. 2

Δείκτες και τύποι δεδομένων Η έννοια του δείκτη μπορεί να εφαρμοστεί σε κάθε τύπο Τ για να οριστεί ο τύπος δείκτης-σε-τ. Υπάρχει συντακτική συμβατότητα ανάμεσα: στην τιμή που βρίσκεται στην που περιέχει μια μεταβλητή δείκτης-σε-τ και την τιμή μιας μεταβλητής τύπου Τ στην τιμή μιας μεταβλητής δείκτης-σε-τ και την μιας μεταβλητής τύπου Τ Η ειδική τιμή NULL (0) σημαίνει «καμία», και είναι η συνηθισμένη τιμή αρχικοποίησης μιας μεταβλητής δείκτη. Η προσπάθεια προσπέλασης της ς 0 έχει σαν αποτέλεσμα τον τερματισμό του προγράμματος. 3

Τελεστές που αφορούν δείκτες Ο τελεστής & (reference) εφαρμόζεται σε μια μεταβλητή και επιστρέφει την της. Ο τελεστής * (dereference) εφαρμόζεται σε μια μεταβλητή δείκτη-σε-τ ώστε αυτή να ερμηνευτεί σαν μεταβλητή τύπου Τ. Μπορεί να χρησιμοποιηθεί σε οποιαδήποτε έκφραση αποτίμησης ή/και ανάθεσης όπου αναμένεται μια μεταβλητή (ή τιμή) τύπου Τ. Μέσω ενός δείκτη που περιέχει την μιας (συμβατικής) μεταβλητής μπορούμε να διαβάσουμε / αλλάξουμε έμμεσα την τιμή της μεταβλητής, χωρίς να φαίνεται στον κώδικα το όνομα της. Αυτό είναι μια μορφή παρενέργειας! 4

int a; int *b,*c; a = 1; b = &a; *b = 2; *b = *b+1; c = b; *c = *c+2; /* ακέραιος a */ /* δείκτες σε ακέραιο b,c */ /* b γίνεται του a */ /* a γίνεται 2 */ /* a γίνεται 3 */ /* c γίνεται του a */ /* a γίνεται 5 */ 5

char a; a 0 1 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 2 1 1 1 0 1 0 1 0 3 1 0 1 0 1 0 1 1 4 0 0 1 1 0 1 0 1 5

char a; char *b; a 0 1 2 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 3 1 0 1 0 1 0 1 1 4 0 0 1 1 0 1 0 1 5 b

char a; char *b; a='a'; a 0 1 2 3 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 4 0 0 1 1 0 1 0 1 5 b

char a; char *b; a='a'; a 0 1 2 3 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 9 b=&a; 4 0 0 1 1 0 1 0 1 5 0 0 0 0 0 0 1 0 b

char a; char *b; a='a'; a 0 1 2 3 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 0 10 b=&a; 4 0 0 1 1 0 1 0 1 *b='b'; b 5 0 0 0 0 0 0 1 0

Παράκαμψη συντακτικού ελέγχου Ο συντακτικός έλεγχος μπορεί να παρακαμφθεί με χρήση type casting (δηλωμένης μετατροπής τύπου). Έτσι, μια οποιαδήποτε ακέραια τιμή να ανατεθεί (χωρίς μετατροπή) σε μια μεταβλητή δείκτη. Επιτρέπεται αριθμητική με δείκτες π.χ. Αν p είναι μια μεταβλητή δείκτης-σε-τ, τότε η έκφραση p+i μεταφράζεται (αυτόματα) ως p+i*sizeof(t). Δεν υπάρχει τρόπος για τον μεταφραστή να ελέγξει αν μια τιμή που ανατίθεται σε μια μεταβλητή δείκτη-σε-τ (μέσω type cast ή αριθμητικής) αντιστοιχεί πραγματικά στη ενός αντικειμένου Τ. Την ευθύνη ανάθεσης κατάλληλων τιμών σε μεταβλητές δείκτη την έχει ο προγραμματιστής. 11

short int a; char *b; b=(char*)&a; *b = *b+1; b++; /* ακέραιος a (έστω 2 bytes) */ /* δείκτης σε χαρακτήρα b */ /* b γίνεται του a, αλλά η πρόσβαση μέσω b γίνεται με βάση τον τύπο char, ανά byte */ /* το πρώτο byte του a αυξάνεται κατά 1 */ /* b γίνεται του a + 1 */ 12 *b = *b+1; b++; *b = *b+1; /* το δεύτερο byte του a αυξάνεται κατά 1 */ /* b γίνεται του a + 2 */ /* το τρίτο(;) byte του a αυξάνεται κατά 1 */

short int i; char *c; υποθέτουμε μέγεθος short 2 bytes 9 10 11 12 13 14 0 1 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 13

short int i; char *c; i=0x21; 9 10 11 12 13 14 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 14

short int i; char *c; i=0x21; c = (char *) &i; 9 10 11 12 13 14 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 15

short int i; char *c; i=0x21; c = (char *) &i; putchar(*c); /* -> 'a' */ 9 10 11 12 13 14 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1

short int i; char *c; i=0x21; c = (char *) &i; putchar(*c); /* -> 'a' */ c++; 9 10 11 12 13 14 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1

short int i; char *c; i=0x21; c = (char *) &i; putchar(*c); /* -> 'a' */ c++; putchar(*c); /* -> 'b' */ 9 10 11 12 13 14 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1

short int i; char *c; i=0x21; c = (char *) &i; putchar(*c); /* -> 'a' */ c++; putchar(*c); /* -> 'b' */ *c = *c + 1; 9 10 11 12 13 14 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 19

short int i; char *c; i=0x21; c = (char *) &i; putchar(*c); /* -> 'a' */ c++; putchar(*c); /* -> 'b' */ *c = *c + 1; putchar(*c); /* -> 'c' */ 9 10 11 12 13 14 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 20

short int i; char *c; i=0x21; c = (char *) &i; putchar(*c); /* -> 'a' */ c++; putchar(*c); /* -> 'b' */ *c = *c + 1; putchar(*c); /* -> 'c' */ printf("%x",i); /* 31 */ 9 10 11 12 13 14 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 21

short int i; char *c; i=0x21; c = (char *) &i; putchar(*c); /* -> 'a' */ c++; putchar(*c); /* -> 'b' */ *c = *c + 1; putchar(*c); /* -> 'c' */ printf("%x",i); /* 31 */ c++; 9 10 11 12 13 14 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 22

short int i; char *c; i=0x21; c = (char *) &i; putchar(*c); /* -> 'a' */ c++; putchar(*c); /* -> 'b' */ *c = *c + 1; putchar(*c); /* -> 'c' */ printf("%x",i); /* 31 */ c++; *c = 0xFF; 9 10 11 12 13 14 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 23

Προσοχή Η ανάθεση τιμών σε μεταβλητές δείκτες γίνεται με αποκλειστική ευθύνη του προγραμματιστή Χωρίς να γίνεται κάποιος (ολοκληρωμένος) έλεγχος από τον μεταφραστή. Το παραμικρό λάθος όταν χρησιμοποιούμε δείκτες, μπορεί να οδηγήσει σε απρόβλεπτα αποτελέσματα. Χωρίς να το επιθυμούμε (ούτε να το αντιληφθούμε) μπορεί να αλλάξουμε κατά λάθος τιμές μεταβλητών, ακόμα και μεταβλητών-δεικτών... Όπως και στην παράβαση των ορίων ενός πίνακα, τέτοια σφάλματα δύσκολα εντοπίζονται Αν έχουμε τύχη, τερματίζεται η εκτέλεση του προγράμματος. 24