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

Σχετικά έγγραφα
Η γλώσσα προγραμματισμού C

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

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

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

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

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

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

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

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

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

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

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

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

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

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

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

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

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

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

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

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

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

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

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

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

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

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

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

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

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

Εξοικ Εξ ε οικ ίωση ε με το το πρόγ ραμμα πρόγ DEV C++ Επικοι Επικ νωνία οι Χρήσ Χρήστη τη Υπολ Υπο ογισ λ τή

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

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

Διορθώσεις Συμπληρώσεις επί της επανεκτύπωσης 2003 της 2 ης έκδοσης του βιβλίου «Διαδικαστικός Προγραμματισμός C»

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

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

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

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

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

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

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

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

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

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

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

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

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

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

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

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

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

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

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

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

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

Βασικές Αρχές Προγραμματισμού

ΑΣΚΗΣΗ 2: ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΣΤΗ C

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

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

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

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

scanf() scanf() stdin scanf() printf() int float double %lf float

Ενότητα 4: «Εισαγωγή στον Προγραμματισμό. Τα πρώτα προγράμματα σε γλώσσα C»

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

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

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

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 2 Εντολές Εισόδου/Εξόδου Τελεστές. Δρ. Γιώργος Λαμπρινίδης 23/10/2015 Η - Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 1

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

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

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

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

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

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

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

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

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

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

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

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

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

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

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

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

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

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

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

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

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

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

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

Αντικειμενοστρεφής Προγραμματισμός -Python. Κ.Π. Γιαλούρης

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

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

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

Transcript:

Η γλώσσα προγραμματισμού C Οι δείκτες στη C

Η έννοια του δείκτη Την έννοια του δείκτη τη συναντήσαμε σε προηγούμενα μαθήματα. Η συνάρτηση scanf(), καταχωρίζει τιμές σε μεταβλητές χρησιμοποιώντας τον τελεστή διεύθυνσης &. Όταν δηλώνεται μια μεταβλητή τότε δεσμεύεται μια περιοχή μνήμης, η οποία ξεκινά από κάποια διεύθυνση. Αυτή η διεύθυνση η οποία δείχνει που ξεκινά η περιοχή που δεσμεύτηκε με τη δήλωση μιας μεταβλητής ονομάζεται δείκτης. Και ο τελεστής & μπροστά από το όνομα μιας μεταβλητής μας δίνει αυτή τη διεύθυνση της δεσμευμένης μνήμης όπου αποθηκεύεται η μεταβλητή. Πχ int A = 7; printf("value of Α = %d \naddress of A = %u\n", A, &A); Αν λοιπόν Α είναι το όνομα μιας μεταβλητής, τότε &Α είναι η διεύθυνση της μεταβλητής Α στη μνήμη και είναι ένας δείκτης. 2

Η έννοια της διεύθυνσης Η περιοχή που δεσμεύεται στη μνήμη όταν δηλώνεται μια μεταβλητή είναι μια σειρά από διαδοχικά κελιά μνήμης που έχουν χωρητικότητα 1 byte. Σε κάθε κελί της μνήμης αντιστοιχεί μια διεύθυνση. Η διεύθυνση του 1 ου κελιού που δεσμεύεται είναι η διεύθυνση της μεταβλητής. Δήλωση στη C: int Α = 5 ; Η διεύθυνση της Α (&Α) Δείκτης της Α H Α καταλαμβάνει 4 bytes. Γιατί? Διευθύνσεις μνήμης 2293573 2293575 2293576 2293577 Μνήμη 11001010 00000101 00000000 00000000 00000000 01101111 Α 3

Οι μεταβλητές-δείκτες (δήλωση) Στην C oι διευθύνσεις μεταβλητών είναι δυνατόν να αποθηκευτούν επίσης σε μεταβλητές. Αυτές του είδους τις μεταβλητές που περιέχουν (δείχνουν) διευθύνσεις ονομάζονται δείκτες (pointers). Η δήλωση ενός δείκτης γίνεται ως εξής: <τύπος> *<όνομα_δείκτη>; (δημιουργώ ένα δείκτη που μπορεί να δείξει σε διεύθυνση μεταβλητής που έχει δηλωθεί σαν <τύπος>) Ο <τύπος> μπορεί είναι ένας από τους τύπους δεδομένων της C και δηλώνει τον τύπο της μεταβλητής που δείχνει ο δείκτης. Ο αστερίσκος * υποδεικνύει ότι η μεταβλητή που ακολουθεί είναι ένας δείκτης. Το <όνομα_δείκτη> είναι οποιοδήποτε όνομα επιθυμούμε. 4

Παραδείγματα δήλωσης δεικτών int *intptr; Η μεταβλητή intptr είναι δείκτης σε ακεραία μεταβλητή int Δηλαδή στο δείκτη intptr μπορούμε να αποθηκεύσουμε τη διεύθυνση κάποιας ακεραίας μεταβλητής: inptr = &A; char *chatptr; (η μεταβλητή charptr είναι δείκτης σε μεταβλητή χαρακτήρα) floar *floatptr; (η μεταβλητή floatptr είναι δείκτης σε μεταβλητή float) Επειδή οι δείκτες δείχνουν σε διευθύνσεις μεταβλητών και όχι στο περιεχόμενο τους το μέγεθος τους είναι σταθερό και ίδιο για όλους τους τύπους (συνήθως 4 Bytes). Δεν εξαρτάται από τον τύπο της μεταβλητής. 5

Ανάθεση τιμών σε δείκτες Πριν χρησιμοποιηθεί ένας δείκτης πρέπει να δείχνει σε μια διεύθυνση. Ο τελεστής & που δίνει την διεύθυνση μιας μεταβλητής χρησιμοποιείται για να δώσουμε τιμές σε δείκτες: int A, *intptr; Προσοχή: Ο τύπος του δείκτη πρέπει να είναι ο ίδιος με αυτόν της μεταβλητης. intptr = &A; Η τιμή που δίνουμε σε έναν δείκτη πρέπει να είναι διεύθυνση κάποιας μεταβλητής και όχι μία αριθμητική τιμή. intptr = 2000; Στην εντολή printf () για να δούμε το περιεχόμενο ενός δείκτη χρησιμοποιούμε το προσδιοριστή %p που εμφανίζει τη τιμή του δείκτη σε 16-δική μορφή. Μπορούμε να χρησιμοποιήσουμε και τους προσδιοριστές %u και %d. 6

Η τιμή NULL Αν προσπαθήσουμε να χρησιμοποιήσουμε ένα δείκτη πριν αυτός πάρει κάποια τιμή διεύθυνσης, τότε το πρόγραμμα δεν θα εκτελεστεί σωστά. Όταν δηλώνεται ένας δείκτης δεν του αποδίδεται από τη C κάποια τιμή. Μπορούμε να χρησιμοποιήσουμε τη σταθερά NULL για να δώσουμε δώσουμε αρχική τιμή σ ένα δείκτη: int *intptr = NULL; Η σταθερά NULL βρίσκεται στη βιβλιοθήκη <stdio.h> και έχει τη τιμή 0. Δεν δείχνει πουθενά και πρέπει να χρησιμοποιείται με προσοχή. 7

Ο τελεστης * Εφαρμόζεται μόνο σε δείκτες. O τελεστής * πριν το όνομα του δείκτη μας δίνει το περιεχόμενο (την τιμή) της διεύθυνσης που δείχνει ο δείκτης int a =5, *aptr; ptr=&a; printf(" Value of a = %d", *ptr); Μπορούμε ν αλλάξουμε το περιεχόμενο μιας μεταβλητής με τον δείκτη της: *ptr =78; a = 78 *ptr = *ptr+1; Value of a = 5 a = a+1 Πρόκειται για μία έμμεση αναφορά στη τιμή μιας μεταβλητής. Δεν είναι ο ίδιος με τον τελεστή του πολλαπλασιασμού. 8

Παράδειγμα #include <stdio.h> main() { int i, *pi; i = 155; pi = &i; printf("%d - %d \n",i,*pi); printf("%p - %p \n",pi,&i); printf("%u - %u \n\n",pi,&i); *pi=199; printf("%d - %d \n",i,*pi); printf("%p - %p \n",pi,&i); printf("%u - %u \n",pi,&i); } 155-155 0022FF44-0022FF44 2293572 2293572 199-199 0022FF44-0022FF44 2293572-2293572 9

Τι συμβαίνει ότι δίνουμε τιμές σε δείκτες Διευθύνσεις μνήμης Μνήμη int A, B; int *p1, *p2; 2293582 2293586 Α B p1 p2 A = 56; B = -23; 2293582 2293586 56-23 Α B p1 p2 p1 = &A; p2 = &B; 2293582 2293586 56-23 Α B p1 p2 10

Διαχείριση και διευθύνσεων και περιεχομένου Διευθύνσεις μνήμης Μνήμη *p1 = 78; (αλλάζω το περιεχόμενο της Α) 2293582 2293586 78-23 Α B p1 p2 *p1 = *p2; (αποτέλεσμα ίδιο σαν Α=Β) 2293582 2293586-23 -23 Α B p1 p2 p1 = p2; (ο p1 δείχνει όπου και ο p2) 2293582 2293586-23 -23 Α B p1 p2 11

Τα & και * είναι συμπληρωματικά (αντίστροφα) #include <stdio.h> #include <stdlib.h> main() { int a; int *aptr; a = 7; } The address of a is 0028FF4 The value of aptr is 0028FF44 The value of a is 7 The value of *aptr is 7 &*aptr = 0028FF44 *&aptr = 0028FF44 aptr = &a; // aptr δείχνει στη διεύθυνση του a printf( "The address of a is %p\n The value of aptr is %p\n", &a, aptr ); printf( "The value of a is %d\n The value of *aptr is %d", a, *aptr ); // Τα & και * είναι συμπληρωματικά printf( "\n &*aptr = %p\n*&aptr = %p\n", &*aptr, *&aptr ); system("pause"); 12

Αριθμητική των δεικτών Επιτρέπονται μόνο 2 αριθμητικές πράξεις: η πρόσθεση και η αφαίρεση. Οι τελεστές που χρησιμοποιούνται είναι οι +, -, ++ και --. Όταν προσθέτω 1 σ ένα δείκτη τότε Αν η μεταβλητή που δείχνει είναι char, ο δείκτης αυξάνεται κατά 1 (μέγεθος του char 1 = Byte). Αν η μεταβλητή που δείχνει είναι int, ο δείκτης αυξάνεται κατά 4 (μέγεθος του int 4 = Bytes). Αν η μεταβλητή που δείχνει είναι double, ο δείκτης αυξάνεται κατά 8 (μέγεθος του double 8 = Bytes). Κάνουμε μόνο πρόσθεση ακεραίου σε δείκτη ή αφαίρεση ακεραίου από δείκτη. Μπορούμε να κάνουμε αφαίρεση 2 δεικτών όταν αυτοί δείχνουν στο ίδιο τύπο μεταβλητής. 13

Στο εργαστήριο Μεταγλωττίστε τα προγράμματα που υπάρχουν στο περιεχόμενο της θεωρίας του μαθήματος. Γράψτε ένα πρόγραμμα που θα διαβάζει 3 ακεραίους. Να υπολογιστεί και να εμφανιστεί στη οθόνη το άθροισμα και το γινόμενο τους με χρήση δεικτών. Γράψτε ένα πρόγραμμα το οποίο θα μετρά από το 1 έως το 10 και θα τους εμφανίζει στη οθόνη με χρήση δείκτη. Γράψτε ένα πρόγραμμα το οποίο να διαβάζει δύο ακέραιους με χρήση δεικτών. Με αυτούς τους δείκτες, αποθηκεύστε το άθροισμά τους σε έναν άλλον δείκτη σε ακέραιο και εμφανίστε τα περιεχόμενα του κάθε δείκτη. Γράψτε ένα πρόγραμμα με το οποίο να διαπιστώνετε ότι το μέγεθος των δεικτών είναι σταθερό και δεν εξαρτάται από το τύπο της μεταβλητής που δείχνει -χρησιμοποιείστε τo τελεστή sizeof(). 14