ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Διδάσκοντες:Στάθης Ζάχος Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΠρογραμματισμός Ηλεκτρονικών Υπολογιστών Διαφάνειες παρουσίασης #9 Διαχείριση της μνήμης Δείκτες Συνδεδεμένες λίστες
2Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Διαχείριση της μνήμης(i) u Στατικές μεταβλητές: γενικές ή τοπικές l ο χώρος στη μνήμη όπου τοποθετούνται δεσμεύεται κάθε φορά που καλείται η ενότητα όπου δηλώνονται και αποδεσμεύεται στο τέλος της κλήσης u Δυναμικές μεταβλητές l ο χώρος στη μνήμη όπου τοποθετούνται δεσμεύεται και αποδεσμεύεται δυναμικά, δηλαδή με φροντίδα του προγραμματιστή l η προσπέλαση σε δυναμικές μεταβλητές γίνεται με τη χρήση δεικτών (pointers)
3Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Διαχείριση της μνήμης(ii) u Με τη βοήθεια των δυναμικών μεταβλητών υλοποιούνται δυναμικοί τύποι δεδομένων l συνδεδεμένες λίστες, l δέντρα, γράφοι, κ.λπ. u Πλεονεκτήματα των δυναμικών τύπων l μπορούν να περιέχουν απεριόριστο πλήθος στοιχείων (αν το επιτρέπει η διαθέσιμη μνήμη) l κάποιες πράξεις υλοποιούνται αποδοτικότερα (π.χ. προσθήκη και διαγραφή στοιχείων σε ενδιάμεση θέση)
4Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Δείκτες(i) u Δείκτης (pointer): η διεύθυνση μιας περιοχής της μνήμης όπου βρίσκεται μια δυναμική μεταβλητή u Παράδειγμα var p : ^integer;... (* ο δείκτης p τοποθετείται να δείχνει σε κάποια ακέραια δυναμική μεταβλητή *)... p^ := 42; writeln(p^ + 1) p 42
5Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Δείκτες(ii) u Κενός δείκτης (nil pointer): ειδική τιμή δείκτη που δε δείχνει πουθενά u Παράδειγμα var p : ^integer;... p := nil p u Απαγορεύεται η προσπέλαση της μνήμης μέσω ενός κενού δείκτη p := nil; writeln(p^) λάθος!
6Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Δυναμική παραχώρηση μνήμης u Δέσμευση l δημιουργία μιας νέας δυναμικής μεταβλητής var p : ^integer;... new(p) p u Αποδέσμευση l καταστροφή μιας δυναμικής μεταβλητής... dispose(p) p
7Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Σύνθετες δυναμικές μεταβλητές(i) u Παράδειγμα type nodeptr = ^nodetype; nodetype = record info : integer; next : nodeptr end; var p : nodeptr;... new(p); p^.info := 42; p^.next := nil p 42
8Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών ξεκρέμαστοι δείκτες! Σύνθετες δυναμικές μεταβλητές(ii) u Παράδειγμα (συνέχεια) q := p; p 42 q q^.info := 563; q^.next := q; p 563 q dispose(p)
9Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Δείκτες και ανάθεση(i) u Ανάθεση δεικτών q := p σκουπίδια! p 42 q 7 πριν p 42 q 7 μετά
10Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Δείκτες και ανάθεση(ii) u Ανάθεση τιμών q^ := p^ σκουπίδια! p 42 q 7 πριν μετά p 42 q
11Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Συνδεδεμένες λίστες(i) u Είναι γραμμικές διατάξεις u Κάθε κόμβος περιέχει: l κάποια πληροφορία l ένα σύνδεσμο στον επόμενο κόμβο u Ο τελευταίος κόμβος έχει κενό σύνδεσμο
12Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Συνδεδεμένες λίστες(ii) u Ευκολότερη προσθήκη στοιχείων l πριν l μετά
13Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Συνδεδεμένες λίστες(iii) u Ευκολότερη διαγραφή στοιχείων l πριν l μετά
14Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Συνδεδεμένες λίστες(iv) u Τύπος κόμβου συνδεδεμένης λίστας type nodeptr = ^nodetype; nodetype = record info : integer; next : nodeptr end πρωθύστερο! u Μια συνδεδεμένη λίστα παριστάνεται συνήθως με ένα δείκτη στο πρώτο της στοιχείο var head : nodeptr
15Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Συνδεδεμένες λίστες(v) u Παράδειγμα κατασκευής λίστας program linkedlist(input,output); type nodetype = record info : integer; next : ^nodetype end; var head, node : ^nodetype; data : integer;
16Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Συνδεδεμένες λίστες(v) u Παράδειγμα (συνέχεια) begin head := nil; read(data); while not eof do begin new(node); node^.info := data; node^.next := head; head := node; read(data) end end.
17Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Συνδεδεμένες λίστες(vi) u Εκτύπωση λίστας procedure print(p : nodeptr); begin while p <> nil do begin writeln(p^.info); p := p^.next end
18Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Συνδεδεμένες λίστες(vii) u Εκτύπωση λίστας με αναδρομή procedure print(p : nodeptr); begin if p <> nil then begin writeln(p^.info); print(p^.next) end
19Νίκος Παπασπύρου Προγραμματισμός Ηλεκτρονικών Υπολογιστών Συνδεδεμένες λίστες(viii) u Εκτύπωση λίστας αντίστροφα με αναδρομή procedure printBackwards(p : nodeptr); begin if p <> nil then begin printBackwards(p^.next); writeln(p^.info) end