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

Σχετικά έγγραφα
Διάλεξη 12η: Δείκτες, μέρος 2

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

Διάλεξη 10η: Πολυδιάστατοι Πίνακες

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

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

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

Δείκτες (Pointers) (1/2) ΗΥ150 Προγραμματισμός

Διάλεξη 15η: Αναδρομή, μέρος 1ο

ΗΥ-150. Προγραμματισμός

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

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

Σημειώσεις δεύτερης εβδομάδας

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

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

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

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

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

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

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

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

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

Διάλεξη 18η: Διαχείρηση Αρχείων

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

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

Διάλεξη 8η: Αλφαριθμητικά (strings)

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

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

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

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

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

Διάλεξη 5η: Εντολές Επανάληψης

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

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

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

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

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 8 η : Συναρτήσεις Χειµερινό Εξάµηνο 2011

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 4η Διάλεξη Πίνακες Συναρτήσεις

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

Δείκτες στην C (επανάληψη)

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

Διάλεξη 22η: Επιπλέον στοιχεία της C

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

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

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

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

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ενδεικτικές λύσεις και στατιστικά

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

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

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

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

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

C: Από τη Θεωρία στην Εφαρμογή

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

Κεφάλαιο 3.1, : Συναρτήσεις I. (Διάλεξη 11)

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

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

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

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

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

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

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

ΗΥ-150. Προγραµµατισµός. Πίνακες (Arrays)

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

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

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

Transcript:

Διάλεξη 11η: Δείκτες, μέρος 1 Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Pointers I CS100, 2016-2017 1 / 16

Δείκτες Τι είναι: Τύπος μεταβλητών (όπως int, float, κλπ) Αποθηκεύουν τη διεύθυνση στη μνήμη άλλων μεταβλητών Χρήσεις Δυναμική διαχείριση μνήμης και δυναμικές δομές δεδομένων Call-by-reference Στενή σχέση με τους πίνακες Πηγή πολλών λαθών που δύσκολα ανιχνεύονται Πρατικάκης (CSD) Pointers I CS100, 2016-2017 2 / 16

Παράδειγμα Παράδειγμα δείκτη int counter = 42; int *pointer_to_counter = &counter; Όνομα Θέση μνήμης Περιεχόμενα counter 1073741824 42 pointer_to_counter 2147483648 1073741824 Πρατικάκης (CSD) Pointers I CS100, 2016-2017 3 / 16

Δήλωση Δεικτών Χρησιμοποιούμε το * για δήλωση δείκτη int *ptr; Ορίζει δείκτη σε ακέραιο (int) Δήλωση πολλών μεταβλητών τύπου δείκτη απαιτεί τη χρήση ενός * μπροστά από κάθε μεταβλητή int *ptr1, *ptr2; Μπορούμε να δηλώσουμε δείκτη σε οποιοδήποτε είδος μεταβλητής (ακόμα και άλλο δείκτη) double *ptr2dbl; char **ptr2ptr2char; Δείκτης σε double Δείκτης σε δείκτη σε char Πρατικάκης (CSD) Pointers I CS100, 2016-2017 4 / 16

Τελεστές Δεικτών Τελεστής &: η διεύθυνση μιας μεταβλητής Τελεστής & q = &a; Εφαρμόζεται σε οποιαδήποτε μεταβλητή Επιστρέφει τη διεύθυνση στην οποία είναι αποθηκευμένη η μεταβλητή Τελεστής *: αναφορά (dereference) σε δείκτη Τελεστής * a = *q; Εφαρμόζεται σε δείκτη Επιστρέφει τα περιεχόμενα της διεύθυνσης στην οποία δείχνει ο δείκτης Πρατικάκης (CSD) Pointers I CS100, 2016-2017 5 / 16

Παράδειγμα pointerc int y = 5; int *ptr; ptr = &y; *ptr = *ptr * 2; Μπορεί να αλλάξει η τιμή των μεταβλητών με τη βοήθεια δεικτών Η τιμή του y γίνεται ίση με 10 Η μεταβλητή y αλλάζει τιμή χωρίς να υπάρχει εντολή που να αποθηκεύει κάτι άμεσα στο y Η έκφραση *ptr είναι ψευδώνυμο (alias) της μεταβλητής y Τα & και * είναι ανάποδα και αλληλοακυρώνονται *(&y) == y &(*ptr) == ptr /* Εκτός αν ο δείκτης είναι κενός */ Πρατικάκης (CSD) Pointers I CS100, 2016-2017 6 / 16

Κλήση με δείκτη callbyrefc #include <stdioh> void cube(int *); int main(void) { int number = 5; printf( The original value of number is %d\n, number); cube(&number); printf( The new value of number is %d\n, number); return 0; void cube(int *ptr) { *ptr = *ptr * *ptr * *ptr; Έξοδος The original value of number is 5 The new value of number is 125 Πρατικάκης (CSD) Pointers I CS100, 2016-2017 7 / 16

Παράδειγμα bubblesortc #include<stdioh> #define SIZE 10 void bubblesort(int *, const int); void swap(int *, int *); int main(void) { int i, a[size] = { 2, 6, 4, 8, 10, 12, 89, 68, 42, 37 ; void bubblesort(int *array, const int size) { int pass, j; for(pass = 0; pass < size -1; pass++) { for(j = 0; j < size - 1; j++) { if(array[j] > array[j + 1]) { swap(&array[j], &array[j + 1]); void swap(int *ptr1, int *ptr2) { int hold = *ptr1; *ptr1 = *ptr2; *ptr2 = hold; printf( Data items in original order\n ); for(i = 0; i < SIZE; i++) { printf( %4d, a[i]); printf( \n ); bubblesort(a, SIZE); printf( Data items in ascending order\n ); for(i = 0; i < SIZE; i++) { printf( %4d, a[i]); printf( \n ); return 0; Πρατικάκης (CSD) Pointers I CS100, 2016-2017 8 / 16

Παράδειγμα (2) Έξοδος Data items in original order 2 6 4 8 10 12 89 68 42 37 Data items in ascending order 2 4 6 8 10 12 37 42 68 89 Πρατικάκης (CSD) Pointers I CS100, 2016-2017 9 / 16

Αριθμητική Δεικτών Στους δείκτες μπορούμε να πραγματοποιούμε αριθμητικές πράξεις ++ ή -- Ο δείκτης δείχνει στο επόμενο ή προηγούμενο αντικείμενο Πχ, αν είναι δείκτης σε ακέραιο στον επόμενο ή προηγούμενο ακέραιο Αντίστοιχα για +, +=, - ή -= Οι δείκτες μπορούν να αφαιρούνται ο ένας από τον άλλο Προκύπτει απόσταση Πχ: πόσοι ακέραιοι υπάρχουν από το *ptr1 μέχρι το *ptr2 Αυτές οι πράξεις έχουν νόημα όταν γίνονται πάνω σε δείκτες που δείχνουν στα στοιχεία ενός πίνακα Πρατικάκης (CSD) Pointers I CS100, 2016-2017 10 / 16

Παράδειγμα pointer-arithc int array[5] = {1, 2, 3, 4, 5; int *ptr; ptr = array; ptr = &array[0]; ptr++; ptr += 2; Ο δείκτης δείχνει στην αρχή του πίνακα Αυξάνοντας το δείκτη κατά 1 δείχνει στο επόμενο στοιχείο, sizeof(int) bytes μετά (όχι στην επόμενη διεύθυνση μνήμης) Πρατικάκης (CSD) Pointers I CS100, 2016-2017 11 / 16

Πίνακες και Δείκτες pointer-arithc int array[5] = {1, 2, 3, 4, 5; int *ptr; ptr = array; ptr = &array[0]; ptr++; ptr += 2; Υπάρχουν πολλοί τρόποι να βρούμε το τελευταίο στοιχείο του πίνακα array[4] *(array + 4) ptr[4] *(ptr + 4) Πρατικάκης (CSD) Pointers I CS100, 2016-2017 12 / 16

Πίνακες και Δείκτες: Διαφορές int *ptr; Η μεταβλητή ptr είναι δείκτης σε ακέραιο Δεσμεύεται μνήμη μόνο για την ptr (όχι για αυτό που δείχνει) Τα περιεχόμενα της μεταβλητής ptr (μια διεύθυνση μνήμης) μπορούν να αλλάξουν int array[10]; Η μεταβλητή array είναι σταθερός δείκτης σε ακέραιο Δεσμεύεται μνήμη για 10 ακέραιους Τα περιεχόμενα της μεταβλητής array (η διεύθυνση μνήμης του πρώτου στοιχείου) δεν μπορούν να αλλάξουν Πρατικάκης (CSD) Pointers I CS100, 2016-2017 13 / 16

Πίνακες και Δείκτες: Ορίσματα Αν μια συνάρτηση παίρνει δείκτη τότε δέχεται και πίνακα Αν μια συνάρτηση παίρνει πίνακα τότε δέχεται και δείκτη Και στις δύο περιπτώσεις περνά μια διεύθυνση στη μνήμη Παράδειγμα void get_array(int a[]); void get_ptr(int *b); int main() { int *ptr, array[10]; get_ptr(array); get_array(ptr); Προσοχή με τη δέσμευση της μνήμης Αν το πρόγραμμα προσπαθήσει να διαβάσει διεύθυνση μνήμης που δεν είναι δεσμευμένη: crash! Πρατικάκης (CSD) Pointers I CS100, 2016-2017 14 / 16

Παράδειγμα ptr-arith2c #include <stdioh> int main() { int array[10] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 1; int *ptr, i ; printf( First way to traverse the array: indexing\n ); for (i = 0; i < 10; i++) { printf( array[%d] = %d\n, i, array[i]); printf( \nsecond way to traverse the array: pointer arithmetic\n ); for (i=0; i < 10; i++) { printf( array[%d] = %d\n, i, *(array + i)); Πρατικάκης (CSD) Pointers I CS100, 2016-2017 15 / 16

Παράδειγμα (2) ptr-arith2c printf( \nthird way to traverse the array: pointer arithmetic\n ); /* set the pointer to the beginning of the array */ ptr = array; for (i = 0; i < 10; i++) { printf( array[%d] = %d\n, i, *(ptr + i)); printf( \nfourth way to traverse the array: pointer arithmetic\n ); ptr = array; for (i = 0 ; i < 10; i++) { printf( array[%d] = %d, %d\n, i, *(ptr++), ptr); printf( Check\n ); return 0; Πρατικάκης (CSD) Pointers I CS100, 2016-2017 16 / 16