HY255 Εργαστήριο Λογισμικού L03

Σχετικά έγγραφα
Δομημένος Προγραμματισμός (ΤΛ1006)

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

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

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

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

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

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

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

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

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

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

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

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

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

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

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

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

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

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

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

Διάλεξη 9η: Πίνακες (arrays)

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

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

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

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

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

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

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

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

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

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

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

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

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

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

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

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

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

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

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

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

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

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

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

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

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

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

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

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

Αρχιτεκτονική Υπολογιστών

Η γλώσσα C. Δείκτες (pointers)

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

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

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

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

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

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

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

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

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

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

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

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

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

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

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

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

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

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

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

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

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

Η γλώσσα C. Δείκτες (pointers)

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

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

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

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

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

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

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

Εισαγωγή στην PHP. ΕΣΔ 516 Τεχνολογίες Διαδικτύου. Περιεχόμενα. Περιεχόμενα. ΕΣ 516: Τεχνολογίες ιαδικτύου. ΕΣ 516: Τεχνολογίες ιαδικτύου

ΑΣΚΗΣΗ 1. Structural Programming

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

Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

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

Κεφάλαιο 2.5: Τύποι εδοµένων, Τελεστές και Αριθµητικές Εκφράσεις. ( ιαλέξεις 5-6) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

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

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

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Transcript:

HY255 Εργαστήριο Λογισμικού L03 Pointers, Strings, Arrays HY255 Εργαστήριο Λογισμικού Άνοιξη 2021 Άγγελος Μπίλας L03.HY255.CSD-UoC 1

Τι είναι ο τύπος pointer σε Ένας τύπος σαν όλους τους άλλους Από την πλευρά της γλώσσας: Είναι ένας τύπος που μας επιτρέπει να δείχνουμε σε άλλα αντικείμενα (π.χ. μεταβλητές, τιμές). Από την πλευρά του συστήματος: Είναι ένας τύπος που μας επιτρέπει να δείχνουμε σε θέσεις μνήμης (αφού οι μεταβλητές είναι ονόματα για θέσεις μνήμης). Για να δηλώσουμε μια μεταβλητή τύπου pointer (όπως έχετε δει) χρειαζόμαστε τα περιβόητα *. Π.χ. char *cp; To cp είναι μια μεταβλητή τύπου pointer σε άλλες μεταβλητές/τιμές τύπου char. Τα περιεχόμενα μιας μεταβλητής τύπου pointer τα ονομάζουμε διεύθυνση/address. L03.HY255.CSD-UoC 2

Τι ορίζει ο τύπος pointer (1) To μέγεθος των αντίστοιχων μεταβλητών (όπως όλοι οι τύποι): Το μέγεθος μια μεταβλητής τύπου pointer είναι (συνήθως): 32 bits (4 bytes) σε ένα σύστημα που υποστηρίζει 32-bit address spaces (4GB) 64 bits (8 bytes) σε ένα σύστημα που υποστηρίζει 64-bit address spaces (16HexaB) (Εμείς στις ασκήσεις μας δουλεύουμε με 32-bit address spaces, αν και σε πολλές από αυτές δεν παίζει ρόλο, επειδή η γλώσσα μας παρουσιάζει μια αφαίρεση του συστήματος). (2) Τις πράξεις που μπορούμε να κάνουμε σε κάθε μεταβλητή του τύπου pointer σε. Ο τύπος pointer σε υποστηρίζει 2 νέες πράξεις: (1) & à O τελεστής αυτός δημιουργεί μια τιμή τύπου pointer σε (2) * à Ο τελεστής αυτός επιστρέφει τα περιεχόμενα της διεύθυνσης που περιέχονται σε μια μεταβλητή τύπου pointer σε... (dereferencing) Αν δεν είχαμε αυτούς τους τελεστές, δεν θα μπορούσαμε ούτε να δημιουργήσουμε αλλά ούτε και να χειριστούμε τιμές του τύπου pointer σε (addresses) (3) Assignment, π.χ. ip = &i; (4) αριθμητική, π.χ. *(ip + 1) = 3; (5) σύγκριση, π.χ. if (ip == &i)... Μπορούμε να έχουμε μεταβλητές τύπου pointer σε σε οποιοδήποτε τύπο (βασικό ή δομημένο και επίσης σε άλλο τύπο pointer) Ο τύπος μιας μεταβλητής pointer περιέχει και τον τύπο του αντικειμένου που δείχνει, πχ pointer σε char και όχι pointer. Οπότε μια μεταβλητή τύπου pointer σε int έχει διαφορετικό τύπο από μια μεταβλητή pointer σε float. L03.HY255.CSD-UoC 3

Παράδειγμα Δηλώσεις μεταβλητών Μια μεταβλητή τύπου int int i=1; Mια μεταβλητή τύπου pointer σε int int *ip; Δημιουργούμε μια τιμή τύπου address (&i) και την αναθέτουμε στην μεταβλητή ip ip = &i; Αναθέτουμε τον int 5 στο αντικείμενο στο οποίο δείχνει η μεταβλητή ip, και το οποίο αντικείμενο είναι τύπου int (αφού το ip είναι τύπου pointer σε int) *ip = 5; Αναθέτουμε στο i την τιμή (int) στην οποία δείχνει η μεταβλητή ip pointer σε int i = *ip; Όταν γράφουμε το ip αλλάζουμε την θέση Β (ip) Όταν γράφουμε το *ip αλλάζουμε την θέση Α (i) sizeof(i) = sizeof (*ip) = sizeof (int) à συνήθως 4 sizeof (ip) = sizeof(&i) = sizeof (int *) à συνήθως 4 (για μας) Μνήµη i στη θέση A: i=1 ip στη θέση B: ip = (Address of i) = A L03.HY255.CSD-UoC 4

Ποια η σχέση των arrays με pointers? Έχουμε ακούσει/δει ότι τα arrays έχουν στη C κάποια σχέση με pointers, π.χ.: int A[10]; int *ip; ip = &(A[0]); Τέτοιες σχέσεις προκύπτουν από τον ορισμό των τύπων Τι και γιατί επιτρέπεται στην γλώσσα C? Ορισμός: To όνομα ενός array στη C είναι μια σταθερή τιμή τύπου pointer (σε τύπο ίδιο με τον τύπο των στοιχείων του array) Αφού ισχύει αυτό επιτρέπεται πλέον να πούμε ip = A; # το A είναι τιμή τύπου pointer σε int ip = A+1 # αφού οι pointers επιτρέπουν arithmetic ops if (A < ip) # αφού οι pointers επιτρέπουν συγκρίσεις Αλλά και *A = 0; *(A+2) = 0; x = (Α+2)[5], κ.ο.κ. Επιπλέον, εφόσον το όνομα ενός array είναι ισοδύναμο με μια τιμή τύπου pointer σε, τότε μια οποιαδήποτε μεταβλητή τύπου pointer σε μπορεί να χρησιμοποιηθεί σαν όνομα array, άρα: ip[0] = 0; (ip + 1)[0] = 0; array A: µεταβλητή ip Μνήµη A[0] A[1]... A[9] ip = &(A[1]) L03.HY255.CSD-UoC 5

Ωστόσο: Ένα array είναι διαφορετικός τύπος από τον τύπο pointer σε Π.χ. Το array είναι μια μεταβλητή που έχει τόσο χώρο στη μνήμη όσο όλα τα στοιχεία του και επιτρέπει συγκεκριμένες πράξεις Ένας pointer είναι π.χ. 4 bytes και επιτρέπει διαφορετικές πράξεις Επίσης ο υπολογισμός των εκφράσεων κατά την εκτέλεση του προγράμματος γίνεται διαφορετικά όταν περιέχουν ονόματα arrays ή pointers, π.χ. A[i]: πρόσθεσε το i στο Α (σταθερή τιμή) και φέρε τα περιεχόμενα της θέσης που προκύπτει ip[i]: φέρε τα περιεχόμενα της μεταβλητής ip, πρόσθεσε το i, φέρε τα περιεχόμενα της θέσης που προκύπτει array A: µεταβλητή ip Μνήµη A[0] A[1]... A[9] ip = &(A[1]) L03.HY255.CSD-UoC 6

Ποια η σχέση των strings με arrays Στη C δεν υπάρχει χωριστός τύπος string Αντί αυτού χρησιμοποιείται η σύμβαση/ορισμός: (1) String είναι ένα array από στοιχεία char που το τερματίζεται με \0, π.χ. char s[10] = 1234 ; char c = a ; (2) Ωστόσο, η γλώσσα ορίζει ότι σταθερές τύπου string περιγράφονται μέσα σε... και αυτόματα τερματίζονται με \0. To string s έχει χώρο για 10 chars Κατά την δήλωση αρχικοποιείται σε ένα string 1234 που αυτόματα τερματίζεται σε \0 (άρα χρησιμοποιεί τις 5 από τις 10 θέσεις του s) Αφού, εξ ορισμού, τα strings είναι arrays από chars που τερματίζονται σε \0, μπορούμε να χρησιμοποιήσουμε για strings ότι εκφράσεις επιτρέπουν τα arrays, π.χ. c=s[1]; *(s+2) = a ; array s: s[0] Μνήµη 1 s[1] 2 s[2] 3 s[3] 4 s[4] \0 s[5] s[6] s[7] s[8] s[9] µεταβλητή c... a L03.HY255.CSD-UoC 7

Ποια η σχέση των strings με pointers? Ότι υπαγορεύει η γλώσσα με τους μέχρι τώρα ορισμούς arrays και pointers char *s = 12345 ; char sa[6] = abcd ; char c = z ; To s είναι μια μεταβλητή τύπου pointer που δείχνει σε μια σταθερή τιμή string (array από chars που τερματίζεται με \0 ). Για το s ισχύει ότι ισχύει για pointers Το sa είναι ένα array από chars που έχει αρχικοποιηθεί σε μια σταθερή τιμή string (chars με \0 στο τέλος) Τα s, sa, c είναι (εντελώς) διαφορετικά αντικείμενα στη μνήμη Η γλώσσα μας επιτρέπει να γράψουμε όλες τις εκφράσεις που επιτρέπονται για arrays, pointers *s = a ; sa[1] = a s = sa; array sa: sa[0] sa[1] sa[2] sa[3] Μνήµη 1 2 3 4 \0 a b c d sa[4] \0 sa[5] sa[6] µεταβλητή s µεταβλητή c... z L03.HY255.CSD-UoC 8

Ακριβέστερα: Πότε ένα array είναι το ίδιο με ένα pointer Ένα array name σε μια έκφραση (σε αντίθεση με μια δήλωση) είναι ισοδύναμο με έναν pointer Αλλά: στις δηλώσεις μεταβητών το όνομα ενός array είναι διαφορετικό αντικείμενο από το όνομα ενός pointers Π.χ. οι δηλώσεις int A[10] και int *A δηλώνουν διαφορετικά αντικείμενα. Εκτός από την περίπτωση: Ένα array name είναι το ίδιο με έναν pointer στο πρώτο element του array στην δήλωση παραμέτρων συναρτήσεων Π.χ. Οι δηλώσεις f(int A[10]) και f(int *A) είναι ακριβώς ίδιες Αυτή η εξαίρεση έγινε στη C για λόγους απόδοσης όταν οι παράμετροι των συναρτήσεων είναι μεγάλα arrays Ένα index σε έναν πίνακα είναι πάντα ισοδύναμο με το offset από έναν pointer Η σχέση των arrays με pointers και η χρήση της αριθμητικής των pointers έχουν συνέπειες στη C: Οι θέσεις ενός array πρέπει να είναι σε συνεχόμενες θέσεις μνήμης Οι θέσεις ενός array πηγαίνουν από μικρότερες προς μεγαλύτερες διευθύνσεις στη μνήμη L03.HY255.CSD-UoC 9

Προσοχή με τους pointers Όταν χρησιμοποιείται pointers, arrays, strings δηλώστε προσεκτικά την κάθε μεταβλητή ανάλογα με το τι θέλετε να εκφράσετε, π.χ. Θέλετε να κρατήσετε χώρο στη μνήμη; Πόσο; Χρειάζεστε μια βοηθητική μεταβλητή που θα δείχνει/διατρέχει άλλες μεταβλητές; Γιατί χρειαζόμαστε pointers? Απόδοση, π.χ. Οι pointers μας επιτρέπουν να συνθέτουμε αντικείμενα από υπάρχουσες τιμές, χωρίς να χρειάζεται να δημιουργούμε νέα αντίγραφα. Ευκολία στην έκφραση συγκεκριμένων προγραμμάτων (many would argue against) Παρατηρήστε ότι μέχρι τώρα δεν έχουμε πει τίποτε για δυναμική μνήμη Οι pointers δεν ταυτίζονται με την δυναμική μνήμη Μέχρι τώρα τους ορίσαμε και τους χρησιμοποιούμε χωρίς δυναμική μνήμη Όλη η μνήμη που χρησιμοποιούμε δεσμεύεται μέσω δηλώσεων μεταβλητών Πολλές φορές οι pointers είναι η πηγή πολλών-πολλών bugs και προβλημάτων, για αυτό και υπάρχουν γλώσσες που απαγορεύουν τους pointers, π.χ. int *f(void){int i=2; return &i;} int main(void){int ip; ip=f(); *ip=...} Αυτό είναι ένα απόλυτα valid και παντελώς λάθος πρόγραμμα που δεν έχει κανένα νόημα L03.HY255.CSD-UoC 10

King Ch. 11, 12, 13 Reading Chapter 5 of (online) The C Book, Mike Banahan, Declan Brady and Mark Doran, Second Edition, 2003. [html] [pdf (updated 2020)] L03.HY255.CSD-UoC 11