ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D.

Σχετικά έγγραφα
ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

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

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

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Πίνακες.

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

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

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

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

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

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

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

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

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

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

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες

Αναφορές, είκτες και Αλφαριθμητικά

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

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

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

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

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

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

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

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

Κλάσεις και αντικείμενα #include <iostream.h<

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

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

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

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

Μεθόδων Επίλυσης Προβλημάτων

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

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

Εισαγωγή στον Προγραµµατισµό «C»

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

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

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

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

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

Κλάσεις και Αντικείµενα

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

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

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

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

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

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

5. ΣΥΝΑΡΤΗΣΕΙΣ. (Πρόχειρο σχέδιο - Μαθήµατος 3) p Συναρτήσεις, που δεν επιστρέφουν κάποια τιµή

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

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

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

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

Διάλεξη 6: Δείκτες και Πίνακες

ΗΥ-150. Πίνακες (Arrays)

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Οι δείκτες στη γλώσσα C

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

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. (Διάλεξη 14) Παράδειγμα: Αλλαγή τιμής μεταβλητής μόνο τοπικά

Μεθόδων Επίλυσης Προβλημάτων

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Συναρτήσεις και Πίνακες

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

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

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

Μεθόδων Επίλυσης Προβλημάτων

ιαφάνειες παρουσίασης #5 (β)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Η βασική συνάρτηση προγράμματος main()

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

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

Μεταβλητές. Έστω η μεταβλητή

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

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

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

Προγραμματισμό για ΗΜΥ

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

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Αλφαριθµητικά Κλάση string

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

είκτες και Πίνακες (2)

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

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

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

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

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

Λογισµικό (Software SW) Γλώσσες

Μονοδιάστατοι πίνακες Πολυδιάστατοι πίνακες Μέθοδοι Μέθοδοι Recursive Overloading

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

Προγραµµατιστικές Τεχνικές

Transcript:

1 ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D. Χειµώνας 2006 ιάλεξη 4η Ιστοσελίδα του µαθήµατος 2 http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall06.htm Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος Επικοινωνία: dimitris@skyblue.csd.auth.gr etousido@uth.gr Περιεχόµενα 3 είκτες και υναµικοί Πίνακες 1

Στόχοι εκµάθησης 4 είκτες Μεταβλητές τύπου δείκτη ιαχείριση µνήµης υναµικοί πίνακες ηµιουργία και χρήση Αριθµητική πινάκων Εισαγωγή στους δείκτες 5 Ορισµός δείκτη: ιεύθυνση µνήµης µιας µεταβλητής Θυµηθείτε: η µνήµη διαιρείται σε Αριθµηµένες θέσεις µνήµης Οι διευθύνσεις χρησιµοποιούνται ως ονόµατα µεταβλητών Έχουµε ήδηχρησιµοποιήσει δείκτες! Παράµετροι που καλούνται µεαναφορά(call-byreference) Περνάει η διεύθυνση του πραγµατικού ορίσµατος Μεταβλητές τύπου δείκτη 6 Οι δείκτες έχουν τύπο Μπορούν να αποθηκεύσουν δείκτη σε µεταβλητή Όχι int, double, κ.τ.λ. Αλλά: Ένας POINTER σε int, double, κ.τ.λ.! Παράδειγµα: double *p; p δηλώνεται ως µεταβλητή τύπου δείκτη σε double Μπορεί να κρατήσει δείκτες σε µεταβλητές τύπου double Όχι σε άλλους τύπους! 2

ήλωση µεταβλητών τύπου δείκτη 7 Οι δείκτες δηλώνονται όπως και οι άλλοι τύποι Προηγείται το "*" πριν το όνοµα τηςµεταβλητής Παράγει δείκτη σε αυτόν τον τύπο Το "*" να προηγείται κάθε µεταβλητής int *p1, *p2, v1, v2; Οι p1, p2 είναι δείκτες σε µεταβλητές int Οι v1, v2 είναι συνηθισµένες µεταβλητές τύπου int ιευθύνσεις και αριθµοί 8 Ο δείκτης είναι µια διεύθυνση Η διεύθυνση είναι ένας ακέραιος Ο δείκτης ΕΝ είναι ακέραιος! Η C++ εξαναγκάζει τους δείκτες να χρησιµοποιούνται ως διευθύνσεις εν µπορούν να χρησιµοποιηθούν ως αριθµοί Παρόλο που στην πραγµατικότητα είναι ένας αριθµός εικτοδότηση 9 Ορολογία, όψη Μιλάµε πάνταγια δεικτοδότηση, όχι διευθυνσιοδότηση Η µεταβλητή δείκτη δείχνει σε κανονική µεταβλητή Κάνει ευκολότερη την κατανόηση Βλέπουµε αναφορές στη µνήµη 3

είχνοντας σε 10 int *p1, *p2, v1, v2; p1 = &v1; Θέτει τη µεταβλητή δείκτη p1 να δείχνει στη µεταβλητή τύπου int v1 Τελεστής, & Προσδιορίζει τη διεύθυνση µιας µεταβλητής Θα το διαβάζαµεωςεξής: η p1 ισούται µε τη διεύθυνση της v1 ή η p1 δείχνει στη v1 είχνοντας σε 11 Θυµηθείτε: int *p1, *p2, v1, v2; p1 = &v1; Τώρα έχουµε δύο τρόπους για να αναφερόµαστε στη v1: Τη µεταβλητή v1: cout << v1; ιαµέσου του δείκτη p1: cout << *p1; Τελεστής dereference, * Η µεταβλητή δείκτη γίνεται "dereferenced" Σηµαίνει: Πάρε τα δεδοµένα στα οποία δείχνει ο p1 Παράδειγµαχρήσηςδείκτη 12 Θεωρήστε το παράδειγµα κώδικα: v1 = 0; p1 = &v1; *p1 = 42; cout << v1 << endl; cout << *p1 << endl; Παράγει την έξοδο: 42 42 Οι p1 και v1 αναφέρονται στην ίδια µεταβλητή 4

Τελεστής & 13 Ο τελεστής διεύθυνσης του Χρησιµοποιείται επίσης για να καθορίζει παραµέτρους call-by-reference εν είναι σύµπτωση! Θυµηθείτε: οι παράµετροι call-by-reference περνούν τη διεύθυνση του πραγµατικού ορίσµατος Οι δυο χρήσεις του τελεστή είναι στενά συνδεδεµένες εν πρέπει να συγχέεται ο τελεστής & που προηγείται του ονόµατος µιας µεταβλητής, µετον τελεστή αναφοράς & που ακολουθεί τον τύπο µιας µεταβλητής στον ορισµό µιας συνάρτησης. Ανάθεση δεικτών 14 Οι µεταβλητές δείκτη µπορούν να ανατεθούν : int *p1, *p2; p2 = p1; Αναθέτει ένα δείκτη σε έναν άλλο Κάνε τον p2 να δείχνει εκεί όπου δείχνει ο p1 Να µην συγχέεται µε το: *p1 = *p2; Αναθέτει την τιµή πουδείχνεταιαπό τον p1, στην τιµήπουδείχνεταιαπό τον p2 Παράδειγµαανάθεσηςδεικτών 15 5

Τελεστής new 16 Αφού οι δείκτες αναφέρονται σε µεταβλητές εν υπάρχει πραγµατική ανάγκη να έχουµε standard προσδιοριστή Μπορούµεναδεσµεύουµε µεταβλητές δυναµικά Οτελεστήςnew δηµιουργεί µεταβλητές Όχι προσδιοριστές για να αναφερόµαστε σε αυτές Μόνο µετονδείκτη! p1 = new int; ηµιουργεί νέα µεταβλητή χωρίς όνοµα, και αναθέτει τον p1 να δείχνει σ αυτή Μπορούµενατηνπροσπελάσουµε µετο*p1 Χρήση της, όπωςκαιοισυνηθισµένες µεταβλητές Παράδειγµαχρήσηςδεικτών(1/2) 17 Παράδειγµαχρήσηςδεικτών(2/2) 18 6

ιαχείριση 19 Περισσότερα για τον τελεστή new 20 ηµιουργεί νέα δυναµική µεταβλητή Επιστρέφει δείκτη στη νέα µεταβλητή Εάν ο τύπος είναι τύπος class (προσεχείς διαλέξεις): Καλείται ο constructor για το νέο αντικείµενο Κλήση διαφορετικού constructor ανάλογα µεταορίσµατα αρχικοποίησης: MyClass *mcptr; mcptr = new MyClass(32.0, 17); Μπορεί να αρχικοποιήσει και non-class τύπους: int *n; n = new int(17); //Initializes *n to 17 είκτες και συναρτήσεις 21 Οι δείκτες είναι κανονικοί τύποι Μπορούν να χρησιµοποιηθούν όπως και οι άλλοι τύποι Μπορούν να είναι παράµετροι συναρτήσεων Μπορούν να επιστρέφονται από συναρτήσεις Παράδειγµα: int* findotherpointer(int* p); Αυτήηδήλωσησυνάρτησης: Έχει µια παράµετρο δείκτη σε int Επιστρέφει µεταβλητή δείκτη σε int 7

ιαχείριση µνήµης 22 Σωρός (Heap) Αποκαλείται επίσης και freestore Χρησιµοποιείται για τις δυναµικά δεσµευµένες µεταβλητές Όλες οι νέες δυναµικές µεταβλητές καταναλώνουν µνήµηστοfreestore Εάν είναι πάρα πολλές θα µπορούσε να εξαντληθεί όλη η µνήµητουfreestore Μελλοντικές λειτουργίες new θα αποτύχουν εάν το freestore είναι πλήρες Έλεγχος επιτυχίας του new (1/2) 23 Παλιοί µεταγλωττιστές: Έλεγχος εάν επιστράφηκε null από την κλήση στο new: int *p; p = new int; if (p == NULL) { cout << "Error: Insufficient memory.\n"; exit(1); } Εάν πέτυχε η new, το πρόγραµµα συνεχίζει Έλεγχος επιτυχίας του new (2/2) 24 Μερικοί νεότεροι µεταγλωττιστές : Εάν η κλήση στη new αποτύχει: Το πρόγραµµα τερµατίζεται αυτόµατα Παράγει µήνυµα λάθους Η χρήση του ελέγχου για NULL παραµένει καλή διαχρονική πρακτική 8

Μέγεθος του freestore 25 Κυµαίνεται ανάλογα µε την υλοποίηση Συνήθως είναι µεγάλο Τα περισσότερα προγράµµατα δεν θα χρησιµοποιήσουν όλη τη µνήµη ιαχείριση µνήµης Καλή πρακτική Στέρεα αρχή του software engineering Η µνήµη είναι πεπερασµένη Ανεξάρτητα από το µέγεθός της! Τελεστής delete 26 Απο-δεσµεύει τη δυναµική µνήµη Όταν δεν χρειάζεται πλέον Επιστρέφει τη µνήµηστοfreestore Παράδειγµα: int *p; p = new int(5); //Some processing delete p; Αποδεσµεύει τη δυναµική µνήµηπου δείχνεται από τον δείκτη p ηλαδή καταστρέφει τη µνήµη Αιωρούµενοι (dangling) δείκτες 27 delete p; Καταστρέφει τη δυναµική µνήµη Αλλά ο p εξακολουθεί να δείχνει εκεί! Αποκαλείται αιωρούµενος (dangling) δείκτης Εάν ο p χρησιµοποιηθεί (π.χ., *p) Απρόβλεπτα αποτελέσµατα! Συχνά καταστροφικά! Αποφύγετε τους αιωρούµενους δείκτες Αναθέστε στον δείκτη τιµή NULL αµέσως µετά τη delete: delete p; p = NULL; 9

υναµικές και αυτόµατες µεταβλητές 28 υναµικές µεταβλητές (dynamic variables) ηµιουργούνται µε τοντελεστήnew ηµιουργούνται και καταστρέφονται κατά την διάρκεια εκτέλεσης του προγράµµατος Τοπικές µεταβλητές (local variables) ηλώνονται µέσα στον ορισµό συνάρτησης εν είναι δυναµικές ηµιουργούνται όταν καλείται η συνάρτηση Καταστρέφονται όταν τερµατίζεται η συνάρτηση Συχνά αποκαλούνται αυτόµατες automatic µεταβλητές Ορισµός τύπων δείκτη 29 Μπορούµε ναονοµατίσουµε τύπους δείκτη Γιαναδηλώνουµε τους δείκτες όπως και τις άλλες µεταβλητές Εξαλείφουµετηνανάγκηγιατο * στηδήλωσητου δείκτη typedef int* IntPtr; Ορίζει ένα alias για νέο τύπο Εξετάστε τις δηλώσεις: IntPtr p; int *p; Είναι ισοδύναµες Παγίδα: είκτες Call-by-value 30 Συµπεριφορά: λεπτή και προβληµατική Εάν η συνάρτηση αλλάξει την παράµετρο δείκτη αυτή καθ εαυτή αλλάζει µόνο το τοπικό αντίγραφο είτε το παράδειγµα 10

Παράδ. δείκτη call-by-value (1/2) 31 Παράδ. δείκτη call-by-value (1/2) 32 Ερµηνεία call-by-value: sneaky(p); 33 11

υναµικοί πίνακες 34 Μεταβλητές πίνακα Στην πραγµατικότητα µεταβλητές δείκτη! Τυπικός πίνακας Σταθερό µέγεθος υναµικός πίνακας Το µέγεθός του δεν προσδιορίζεται τη στιγµήτου προγραµµατισµού Καθορίζεται όταν εκτελείται το πρόγραµµα Μεταβλητές πίνακα 35 Θυµηθείτε: οι πίνακες αποθηκεύονται στη µνήµη σε συνεχόµενες θέσεις Η µεταβλητή πίνακα αναφέρεται στο πρώτο στοιχείο (indexed variable) Έτσι, η µεταβλητή πίνακα είναι ένα είδος µεταβλητής δείκτη! Παράδειγµα: int a[10]; int * p; Οι a και p είναι και οι δυο µεταβλητές δείκτη! Μεταβλητές πίνακα είκτες 36 Θυµηθείτε το προηγούµενο παράδειγµα: int a[10]; typedef int* IntPtr; IntPtr p; Οι a και p είναι µεταβλητές δείκτη Μπορούµε να εκτελέσουµεαναθέσεις: p = a; // Έγκυρο. Η p τώραδείχνειεκείόπουδείχνειηa Στο πρώτο στοιχείο του πίνακα a a = p; // Μη έγκυρο! Οδείκτης-πίνακας είναι CONSTANT δείκτης! 12

Μεταβλητές πίνακα είκτες 37 Μια διεύθυνση όπως η 0x8f4ffff4 θεωρείται ως σταθερά δείκτη. Μεταβλητή πίνακα int a[10]; Κάτι περισσότερο από µεταβλητή δείκτη Οτύποςτηςείναι int * const Ο πίνακας δεσµεύτηκε ήδη στην µνήµη Η µεταβλητή a ΠΡΕΠΕΙ να δείχνει εκεί πάντα! εν µπορεί να αλλάξει! Σε αντιδιαστολή µε τους συνήθεις δείκτες Που συνήθως (και τυπικά) αλλάζουν Μεταβίβαση Πινάκων: Παράδειγµα # include <iostream.h> const int MAX=5; void main( ) { void centimize(double*,int); double varray[max] = {10.0, 43.1, 95.9, 59.7, 87.3}; centimize(varray,max); // δεν χρειάζεται το &, είναι διεύθυνση ήδη for (int j=0; j<max; j++) cout << endl << varray[ << j << ]= << varray[j] << εκατοστά ; } void centimize(double *ptrd, int size) // ή double[ ] ptrd { for (int j=0; j<size; j++) *ptrd++ *= 2.54; // ερµηνεύεται ως *(ptrd++) } 38 υναµικοί πίνακες 39 Περιορισµοί των πινάκων Πρέπει να καθορίσουµε πρώτα το µέγεθός τους Ίσως να µην το γνωρίζουµε µέχρι να εκτελεστεί το πρόγραµµα! Πρέπει να υπολογίζουµε το µέγιστο µήκος που θα απαιτηθεί Μερικές φορές OK, µερικές όχι Σπατάλη µνήµης υναµικοί πίνακες Μπορεί να µεγαλώνει και να µικραίνει κατά βούληση 13

ηµιουργία δυναµικών πινάκων 40 Πολύ απλό! Χρήση του τελεστή new υναµική δέσµευση µε µεταβλητή δείκτη Τους θεωρούµε όπως και τους συνηθισµένους πίνακες Παράδειγµα: typedef double * DoublePtr; DoublePtr d; d = new double[10]; //Το µέγεθος σε αγκύλες ηµιουργεί τη δυναµικά δεσµευµένη µεταβλητή πίνακα d, µε 10 στοιχεία, βασικού τύπου double ιαγραφή δυναµικών πινάκων 41 Αφού δηµιουργούνται/δεσµεύονται δυναµικά κατά τη διάρκεια εκτέλεσης του προγράµµατος Θα πρέπει να υπάρχει η δυνατότητα καταστροφής τους κατά τη διάρκεια εκτέλεσης του προγράµµατος Θυµηθείτε ξανά το απλό παράδειγµα: d = new double[10]; //Επεξεργασία delete [] d; Αποδεσµεύει τη µνήµηπουδιατέθηκεγιατονδυναµικό πίνακα Οι αγκύλες υπονοούν πίνακα ΠΡΟΣΟΧΗ: ο d εξακολουθεί να δείχνει εκεί! Θα πρέπει να θέτουµε d = NULL ή d = 0; Συνάρτηση που επιστρέφει πίνακα 42 Τύπος δεδοµένων πίνακα δεν µπορεί να αποτελεί επιστροφή συνάρτησης Παράδειγµα: int [] somefunction(); // ΜΗ ΕΓΚΥΡΟ! Επιστρέφουµε δείκτη στον τύπο δεδοµένων του πίνακα: int* somefunction(); // ΕΓΚΥΡΟ! 14

Αριθµητική δεικτών 43 Μπορούµε να εκτελέσουµεαριθµητική πάνω στους δείκτες Αριθµητική ιευθύνσεων Παράδειγµα: typedef double* DoublePtr; DoublePtr d; d = new double[10]; Το d περιέχει τη διεύθυνση του d[0] Το d + 1 αποτιµάται στη διεύθυνση του d[1] Το d + 2 αποτιµάται στη διεύθυνση του d[2] Παράδειγµαεπιστροφήςπίνακα 44 int* doubler(int a[], int size); int main( ) { int a[]={1, 2, 3, 4, 5}; int *b; b = doubler(a, 5);.. delete[] b; return 0; } int* doubler(int a[], int size) { int *temp = new int[size]; for (int i=0; i<size; i++) temp[i] = 2*a[i]; return temp; } Εναλλακτική διαχείριση πινάκων 45 Χρήση αριθµητικής δεικτών! Σάρωση πίνακα χωρίς χρήση δεικτών: for (int i = 0; i < arraysize; i++) cout << *(d + i) << " " ; Ισοδύναµο µε το παρακάτω: for (int i = 0; i < arraysize; i++) cout << d[i] << " " ; Μόνο πρόσθεση/αφαίρεση πάνω στους δείκτες ΌΧΙ πολλαπλασιασµό, διαίρεση Μπορούµεναχρησιµοποιήσουµε τους τελεστές ++ και -- στους δείκτες 15

Σταθερές και Μεταβλητές είκτη 46 Έστω η δήλωση: int intarray[5]; Ηδήλωση*(intarray++); δεν είναι επιτρεπτή γιατί δεν µπορείτε να αυξήσετε µια σταθερά. Η διεύθυνσηintarray περιέχει τον πίνακά σας και δεν µπορεί να αλλάξει αυτό µέχρι να τερµατίσει το πρόγραµµα. Αντιθέτως: int intarray[ ] = {31, 54, 77, 52, 93} int *ptrint; ptrint = intarray; for (int j=0; j<5; j++) cout << endl << *(ptrint++); Ο ptrint είναι µεταβλητή και όχι σταθερά και για αυτό το λόγο µπορεί να αυξηθεί. Πολυδιάστατοι δυναµικοί πίνακες Βεβαίως µπορούµε ναέχουµε! Θυµηθείτε: είναι πίνακες από πίνακες Οι ορισµοί τύπων µας βοηθούµενατο διαπιστώσουµε: typedef int* IntArrayPtr; IntArrayPtr *m = new IntArrayPtr[3]; ηµιουργεί πίνακα από τρεις δείκτες Θα φτιάξουµεκώδικαώστεοκαθέναςτουςνα δεσµεύσει χώρο για 4 ints for (int i = 0; i < 3; i++) m[i] = new int[4]; Προκύπτει ένας δυναµικός πίνακας 3Χ4! 47 Περίληψη 48 Ο δείκτης είναι µια διεύθυνση µνήµης Παρέχει έµµεση αναφορά σε µια µεταβλητή υναµικές µεταβλητές ηµιουργούνται και καταστρέφονται κατά τη διάρκεια εκτέλεσης του προγράµµατος Freestore Χώρος µνήµης για αποθήκευση δυναµικών µεταβλητών υναµικά δεσµευµένοι πίνακες Το µέγεθός τους προσδιορίζεται κατά τη διάρκεια εκτέλεσης του προγράµµατος 16