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

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

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

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

είκτες και Πίνακες Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

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

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

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

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

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

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

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

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

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

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

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

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

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

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

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

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων

Εισαγωγή στον Προγραμματισμό (με. τη C)

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

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

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

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

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.

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

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

ΣΥΝΑΡΤΗΣΕΙΣ Παραδείγματα χρήσης συναρτήσεων

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

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

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

2.1. Εντολές Σχόλια Τύποι Δεδομένων

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

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

οµές (structures) και Eνώσεις (unions)

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

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

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

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

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

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

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

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

Ορισμός μεταβλητών δεικτών και αρχικοποίηση

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

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ερωτήσεις Επανάληψης

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

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

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

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

Δείκτες & Πίνακες Δείκτες, Πίνακες

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

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

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

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

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

Εργαστήριο 2: Πίνακες

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

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

Επανάληψη για τις Τελικές εξετάσεις

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

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

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

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

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

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

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

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

Transcript:

Διάλεξη 3: Δείκτες και Πίνακες Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Αριθμητική Δεικτών Δείκτες και Πίνακες Παραδείγματα Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-1

Δείκτες (pointers) και διευθύνσεις Δείκτης είναι μια μεταβλητή που περιέχει τη διεύθυνση μιας άλλης μεταβλητής. Δείκτες χρησιμοποιούνται στη C γιατί Μερικές φορές είναι ο μόνος τρόπος για τη διατύπωση κάποιου υπολογισμού. Συνήθως οδηγούν σε πιο περιεκτικό και αποτελεσματικό κώδικα. Η μνήμη είναι οργανωμένη ως μια σειρά κελιών, με διαδοχική αρίθμηση, ή διευθύνσεις, που μπορούν να χρησιμοποιηθούν ένα-ένα ή σε συνεχείς ομάδες. 1 κελί τους ενός byte => π.χ., char, 2 κελιά τους ενός byte => π.χ., short, 4 κελιά του ενός byte => π.χ., int. Δείκτης είναι μια ομάδα κελιών 4 (x86) ή 8 (x64) που μπορούν να κρατήσουν μια διεύθυνση. ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-2

Βασικοί Τύποι Δεδομένων C Περίληψη (για x86) Τύπος Μέγεθος Πεδίο Τιμών Μοναδικές char, 1byte a.. z A.. Z 0.. 9 2 8 ή 256 int, 4 bytes -2 31..2 31-1 2 32 float, 4 bytes 10-37..10 38 2 32 double 8 bytes 10-307..10 308 2 64 δείκτης 4 bytes διευθύνσεις 2 32 (0..2 32-1) ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-3

Δείκτες και διευθύνσεις (συν.) Έστω c ένας int και p ένας δείκτη προς τον c. Στο επίπεδο της μνήμης, γραφικά, αυτό σημαίνει:... p c Τελεστής διεύθυνσης: & (η διεύθυνση του αντικειμένου) Δίνει τη διεύθυνση ενός αντικειμένου. π.χ. &c αποδίδει τη διεύθυνση του c. p = &c : έχει ως αποτέλεσμα ανάθεση στο δείκτη p τη διεύθυνση του c. Τελεστής Έμμεσης Αναφοράς: * (το περιεχόμενο του δείκτη) Οταν εφαρμόζεται σε δείκτη προσπελάζει το αντικείμενο που δείχνει ο δείκτης. Το *p, έχει τιμή την τιμή του c. ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-4

Δήλωση δείκτη: Δεíκτες και διευθύνσεις (συν.) π.χ. int *p; τύπος *όνομα_μεταβλητής int foo(char *); Επομένως ένας δείκτης δείχνει σε αντικείμενα κάποιου συγκεκριμένου τύπου δεδομένων. (εξαίρεση: δείκτης σε void) Προσοχή στη χρήση του *!! a*b; (Τελεστής γινομένου) int *p; (Δήλωση Δείκτη) x = *p + 1; (Τελεστής Έμμεσης Αναφοράς) ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-5

Παρáδειγμα με δείκτες int x = 1, y = 2, z[10]; int *ip, *iq; ip = &x; /* o ip δείχνει τώρα την x */ *ip = *ip + 1; /* η μεταβλητή που δείχει o ip (η x) αυξάνεται κατά 1 */ y = *ip + 3; /* η y παίρνει την τιμή 5 */ *ip = 0; /* η x παίρνει την τιμή 0 */ ip = &z[6]; /* o ip δείχνει τώρα τo z[6] */ iq = ip; /*o iq δείχνει εκεί που δείχνει και ο ip */ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-6

Δείκτες και ορίσματα συναρτήσεων Ξέρουμε ότι αν καλέσουμε μια συνάρτηση με κάποιες παραμέτρους (δια τιμής) τότε αυτές οι τιμές δεν αλλάζουν (Εξαίρεση: πίνακες οι οποίοι περνάνε δια-αναφοράς). Παράδειγμα: Να γράψετε μια συνάρτηση η οποία να έχει σαν αποτέλεσμα την εναλλαγή δύο στοιχείων. void swap1(int x, int y){ int temp; temp = x; x = y; y = temp; } Λάθος! Καλώντας την συνάρτηση ως swap1(a,b) δεν θα έχει καμιά επίδραση στις τιμές των a και b. ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-7

Παράδειγμα void swap(int *px, int *py){ int temp; } temp = *px; *px = *py; *py = temp; Σωστό! Η κλήση swap(&a, &b) θα έχει το επιθυμητό αποτέλεσμα: Αφού ο τελεστής & δίνει τη διεύθυνση μιας μεταβλητής, οι &a και &b είναι δείκτες προς τις μεταβλητές a και b. Οι παραμέτροι της swap δηλώνονται ως δείκτες και η προσπέλαση και ανταλλαγή των τιμών των a και b γίνονται μέσω των δεικτών αυτών. ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-8

Δείκτες και Πίνακες Στην C υπάρχει ισχυρός δεσμός ανάμεσα στους δείκτες και στους πίνακες. Οποιαδήποτε πράξη μπορεί να γίνει με δείκτες πινάκων (πχ α[i]) μπορεί να γίνει και με δείκτες διευθύνσεων *pa. Έστω πίνακας int a[10]. H δήλωση αυτή ορίζει ένα μπλοκ 10 διαδοχικών αντικειμένων με ονόματα α[0], α[1],..., α[9]. Αν int *pa; τότε η ανάθεση pa = &a[0]; κάνει τον pa να δείχνει το μηδενικό στοιχείο του πίνακα. Αριθμητική δεικτών : Αν ο pa είναι δείκτης σε κάποια θέση του πίνακα, τότε οι pa i, pa++, pa-- είναι επίσης δείκτες pa + 1, pa++ δείκτης στο επόμενο στοιχείο του πίνακα από αυτό που δείχνει ο pa. pa + i, (pa i) δείκτης στο σημείο του πίνακα που βρίσκεται i θέσεις μετά (πριν) από αυτό που δείχνει ο pa. ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-9

Δείκτες και Πίνακες (συν.) Έτσι, αν pa = &a[0], τότε για παράδειγμα, pa + 2 *(pa + 2) δείχνει στη τρίτη θέση του πίνακα, δηλ. στο α[2]. έχει τιμή την τιμή της 3ης θέσης του πίνακα, δηλ. το α[2]. Έξ ορισμού, η τιμή μιας μεταβλητής τύπου πίνακα (int a[]) είναι η διεύθυνση του μηδενικού στοιχείου του πίνακα. Επομένως αντί pa = &a[0] μπορούμε να γράψουμε pa = a. Tότε οι pa και a έχουν τις ίδιες τιμές και μπορούν να χρησιμοποιούνται η μια στη θέση της άλλης: Το a[i] είναι ταυτόσημο με τα *(pa +i) ή *(a + i) ή pa[i]. To &a[i] είναι ταυτόσημο με τα a+i, pa+i. ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-10

Δείκτες και Πíνακες (συν.) Προσοχή: ο δείκτης είναι μεταβλητή και έτσι pa = a και pa++ είναι έγκυρες εκφράσεις. Το όνομα ενός πίνακα όμως δεν είναι μεταβλητή, επομένως κατασκευές όπως α = pa και α++ δεν είναι έγκυρες! Ποιες από τις πιο κάτω εντολές είναι έγκυρες; int t[10] = {}, i = 5, *p; p = t; p[2] = 3; ++p; *p = 14; *(t+i) = 33; ++t; => compile error value 0 14 3 0 0 33 0 0 0 0 index t[0] t[1] t[2] t[3] t[4] t[5] t[6] t[7] t[8] t[9] ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-11

Παράδειγμα - strcopy Ζητούμενο: να γράψετε συνάρτηση που αντιγράφει ένα αλφαριθμητικό t στο αλφαριθμητικό s. Γιατί δεν είναι αρκετό να γράψουμε s=t ;;; Eκδοχή με πίνακες: void strcopy (char *s, char *t) { int i; } i=0; while ((s[i] = t[i])!= \0 ) i++ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-12

Eκδοχή με δείκτες: Παράδειγμα - strcopy { } void strcopy1 (char *s, char *t) while ((*s = *t)!= \0 ){ s++; t++; } ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-13

Παράδειγμα 2 - strcmp Ζητούμενο: γράψετε συνάρτηση που συγκρίνει τα αλφαριθμητικά s1 και s2 και επιστρέφει «1» αν το s1 μεγαλύτερο λεξικογραφικά, 0 αν είναι ίσα και «-1» αν s2 μεγαλύτερο λεξικογραφικά 0 1 2 3 4 5 6 7 8 9 s1 C U T \0?????? > Επιστρέφει 1 0 1 2 3 4 5 6 7 8 9 s2 C A T \0?????? ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 3-14

Παράδειγμα 2 - strcmp Α) Eκδοχή με πίνακες* (P.J. Plauger, Standard C Library): int mystrcmp(const char *s1, const char *s2) { int i; Δεν επιτρέπει την αλλαγή του s1 ή s2 for(i=0; s1[i] == s2[i]; i++) if(s1[i] == 0) // i.e., NULL return 0; } return (s1[i] < s2[i])? -1 : 1; Σημειώστε ότι επιστρέφεται «0» όταν η μια συμβολοσειρά είναι υπο-ακολουθία της άλλης ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.

Β) Eκδοχή με δείκτες Παράδειγμα 2 - strcmp int mystrcmp(const char *s1, const char *s2) { Δεν επιτρέπει την αλλαγή του s1 ή s2 for(; *s1 == *s2; ++s1, ++s2) if(*s1 == 0) return 0; } return (*s1 < *s2)? -1 : 1; ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.