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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός Επιπλέον στοιχεία της C++

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7) Είσοδος/ Έξοδος

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

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7)

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

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

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

Περιεχόμενα. Πρόλογος... 21

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

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

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

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

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

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

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

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

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

Περιεχόμενα. Πρόλογος... 17

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

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

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

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

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

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

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

Μεταβλητές τύπου χαρακτήρα

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

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

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

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

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

Εισαγωγή στις Συναρτήσεις

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

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

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

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

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

12. Συναρτήσεις (Μέρος ΙI)

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Transcript:

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

Μετατροπή Τύπων και Δείκτες Ο τύπος του αντικειμένου στο οποίο δείχνει ο δείκτης χρειάζεται για την σωστή αριθμητική δεικτών Όταν ένας δείκτης σε int προχωρά 4 θέσεις, περνάει 4 * sizeof(int) bytes Όλοι οι δείκτες απαιτούν την ίδια μνήμη για την αποθήκευσή τους Μια διεύθυνση μνήμης χρειάζεται τον ίδιο χώρο, άσχετα αν δείχνε σε int ή double Η μετατροπή τύπων από ένα τύπο δείκτη σε άλλο τύπο δείκτη δεν αλλάζει τα περιεχόμενα του δείκτη Πρατικάκης (CSD) Pointers II CS100, 2016-2017 2 / 18

Παράδειγμα: casting ptrcastc #include<stdioh> int main(void) { int i = 0, *iptr = &i; float f = 314159, *fptr = &f; printf( i = %7d, *iptr = %7d\n, i, *iptr); printf( f = %75f, *fptr = %75f\n, f, *fptr); i = (int) f; printf( i = %7d, *iptr = %7d\n, i, *iptr); printf( f = %75f, *fptr = %75f\n, f, *fptr); iptr = (int *) fptr; printf( i = %7d, *iptr = %7d\n, i, *iptr); printf( f = %75f, *fptr = %75f\n, f, *fptr); Έξοδος i = 0, *iptr = 0 f = 314159, *fptr = 314159 i = 3, *iptr = 3 f = 314159, *fptr = 314159 i = 3, *iptr = 1078530000 f = 314159, *fptr = 314159 Πρατικάκης (CSD) Pointers II CS100, 2016-2017 3 / 18

Παράδειγμα: sizeof typesc #include<stdioh> int main(void) { int i = 0, *iptr = &i; double d = 00, *dptr = &d; float f = 00f, *fptr = &f; float *fptrarr[10], farr[10]; printf( Size of i = %zd\n, sizeof(i)); printf( Size of iptr = %zd\n, sizeof(iptr)); printf( Size of d = %zd\n, sizeof(d)); printf( Size of dptr = %zd\n, sizeof(dptr)); printf( Size of f = %zd\n, sizeof(f)); printf( Size of fptr = %zd\n, sizeof(fptr)); printf( Size of fptrarr = %zd\n, sizeof(fptrarr)); printf( Size of farr = %zd\n, sizeof(farr)); return 0; Έξοδος 32bit CPU Size of i = 4 Size of iptr = 4 Size of d = 8 Size of dptr = 4 Size of f = 4 Size of fptr = 4 Size of fptrarr = 40 Size of farr = 40 Έξοδος 64bit CPU Size of i = 4 Size of iptr = 8 Size of d = 8 Size of dptr = 8 Size of f = 4 Size of fptr = 8 Size of fptrarr = 80 Size of farr = 40 Πρατικάκης (CSD) Pointers II CS100, 2016-2017 4 / 18

Σταθεροί δείκτες (const) Προσδιορισμός σταθεράς: const Προσδιορίζει τύπους Σημαίνει ότι η μεταβλητή με αυτόν τον τύπο δεν αλλάζει Χρησιμοποιείται σε παραμέτρους που δεν αλλάζει η συνάρτηση Αν υπάρχει εντολή που αλλάζει μια const μεταβλητή θα προκαλέσει λάθος μεταγλώττισης Σταθεροί δείκτες (const pointers) Δείχνουν σε μια σταθερή διεύθυνση μνήμης Πρέπει να αρχικοποιούνται στη δήλωση Παράδειγμα /* Can write to memory, cannot change pointer */ int *const const_ptr = &x; /* Cannot write to memory, can change pointer */ const int * ptr_to_const = &x; /* Cannot write to memory, cannot change pointer */ const int *const const_ptr_to_const = &x; Πρατικάκης (CSD) Pointers II CS100, 2016-2017 5 / 18

Παράδειγμα: const const-errorc 1 #include<stdioh> 2 int main(void) 3 { 4 int x, y; 5 int *const ptr = &x; 6 7 *ptr = 42; 8 ptr = &y; 9 return 0; 10 Έξοδος gcc100 const-errorc: In function main : const-errorc:8:3: error: assignment of read-only variable ptr Πρατικάκης (CSD) Pointers II CS100, 2016-2017 6 / 18

Πίνακες Δεικτών Ένας πίνακας μπορεί να περιέχει δείκτες Παράδειγμα: Πίνακας από strings char *suit[4] = { Hearts, Diamonds, Clubs, Spades ; Ο πίνακας suit περιέχει 4 δείκτες: στον πρώτο χαρακτήρα της κάθε λέξης Κάθε στοιχείο του πίνακα suit είναι δείκτης σε χαρακτήρα Τα strings δεν αποθηκεύονται στον πίνακα, μόνο οι δείκτες αποθηκεύονται στον πίνακα Ο πίνακας έχει σταθερό μέγεθος: 4 * sizeof(char *) Το κάθε string μπορεί να έχει άλλο μέγεθος suit[0] suit[1] suit[2] suit[3] H e a r t s \0 D i a m o n d s \0 C l u b s \0 S p a d e s \0 Πρατικάκης (CSD) Pointers II CS100, 2016-2017 7 / 18

Πίνακες Δεικτών Ένας πίνακας μπορεί να περιέχει δείκτες Παράδειγμα: Πίνακας από strings char *suit[4] = { Hearts, Diamonds, Clubs, Spades ; Ο πίνακας suit περιέχει 4 δείκτες: στον πρώτο χαρακτήρα της κάθε λέξης Κάθε στοιχείο του πίνακα suit είναι δείκτης σε χαρακτήρα Τα strings δεν αποθηκεύονται στον πίνακα, μόνο οι δείκτες αποθηκεύονται στον πίνακα Ο πίνακας έχει σταθερό μέγεθος: 4 * sizeof(char *) Το κάθε string μπορεί να έχει άλλο μέγεθος suit[0] suit[1] suit[2] suit[3] H e a r t s \0 D i a m o n d s \0 C l u b s \0 S p a d e s \0 Πρατικάκης (CSD) Pointers II CS100, 2016-2017 7 / 18

Πίνακες Δεικτών Ένας πίνακας μπορεί να περιέχει δείκτες Παράδειγμα: Πίνακας από strings char *suit[4] = { Hearts, Diamonds, Clubs, Spades ; Ο πίνακας suit περιέχει 4 δείκτες: στον πρώτο χαρακτήρα της κάθε λέξης Κάθε στοιχείο του πίνακα suit είναι δείκτης σε χαρακτήρα Τα strings δεν αποθηκεύονται στον πίνακα, μόνο οι δείκτες αποθηκεύονται στον πίνακα Ο πίνακας έχει σταθερό μέγεθος: 4 * sizeof(char *) Το κάθε string μπορεί να έχει άλλο μέγεθος suit[0] suit[1] suit[2] suit[3] H e a r t s \0 D i a m o n d s \0 C l u b s \0 S p a d e s \0 Πρατικάκης (CSD) Pointers II CS100, 2016-2017 7 / 18

Πίνακες Δεικτών Ένας πίνακας μπορεί να περιέχει δείκτες Παράδειγμα: Πίνακας από strings char *suit[4] = { Hearts, Diamonds, Clubs, Spades ; Ο πίνακας suit περιέχει 4 δείκτες: στον πρώτο χαρακτήρα της κάθε λέξης Κάθε στοιχείο του πίνακα suit είναι δείκτης σε χαρακτήρα Τα strings δεν αποθηκεύονται στον πίνακα, μόνο οι δείκτες αποθηκεύονται στον πίνακα Ο πίνακας έχει σταθερό μέγεθος: 4 * sizeof(char *) Το κάθε string μπορεί να έχει άλλο μέγεθος suit[0] suit[1] suit[2] suit[3] H e a r t s \0 D i a m o n d s \0 C l u b s \0 S p a d e s \0 Πρατικάκης (CSD) Pointers II CS100, 2016-2017 7 / 18

Πίνακες Δεικτών Ένας πίνακας μπορεί να περιέχει δείκτες Παράδειγμα: Πίνακας από strings char *suit[4] = { Hearts, Diamonds, Clubs, Spades ; Ο πίνακας suit περιέχει 4 δείκτες: στον πρώτο χαρακτήρα της κάθε λέξης Κάθε στοιχείο του πίνακα suit είναι δείκτης σε χαρακτήρα Τα strings δεν αποθηκεύονται στον πίνακα, μόνο οι δείκτες αποθηκεύονται στον πίνακα Ο πίνακας έχει σταθερό μέγεθος: 4 * sizeof(char *) Το κάθε string μπορεί να έχει άλλο μέγεθος suit[0] suit[1] suit[2] suit[3] H e a r t s \0 D i a m o n d s \0 C l u b s \0 S p a d e s \0 Πρατικάκης (CSD) Pointers II CS100, 2016-2017 7 / 18

Παράδειγμα: Τραπουλόχαρτα cardsc #include<stdioh> #include<stdlibh> #include<timeh> /* function declarations */ void shuffle(int[][13]); void deal(int [][13], const char *const [], const char *const []); /* Ο πίνακας που αναπαριστά την τράπουλα * Κάθε γραμμή είναι ένα χρώμα * Κάθε στήλη είναι ένα νούμερο * Τα περιεχόμενα του πίνακα είναι θέσεις * Πχ, αν η θέση deck[3][0] περιέχει 10, * τότε ο Άσσος Κούπα είναι το * 10-ο χαρτί στη σειρά */ int deck[4][13] = {0; /* function definitions */ int main(void) { const char *const suit[4] = { Hearts, Diamonds, Clubs, Spades ; const char *const face[13] = { Ace, Deuce, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King ; srand(time(0)); shuffle(deck); deal(deck, face, suit); printf( \n ); return 0; Πρατικάκης (CSD) Pointers II CS100, 2016-2017 8 / 18

Παράδειγμα: Τραπουλόχαρτα (2) /* Συνάρτηση shuffle * Παίρνει ένα πίνακα που * αναπαριστά μια τράπουλα * Βάζει το κάθε χαρτί σε μια * τυχαία θέση από 1 μέχρι 52 */ void shuffle(int deck[][13]) { int row, col, pos; /* for each of the 4*13 = 52 * positions in the deck of cards */ for(pos = 1; pos <= 52; pos++) { /* find a random card that * is not yet in the deck */ do { row = rand() % 4; col = rand() % 13; while(deck[row][col]!= 0); /* put the card in the next position */ deck[row][col] = pos; /* Συνάρτηση deal * Παίρνει έναν πίνακα με την τράπουλα, τα * ονόματα των χρωμάτων και τα ονόματα * των χαρτιών * Τυπώνει τα τραπουλόχαρτα με τη σειρά * που έχουν στην τράπουλα */ void deal( int deck[][13], const char *const face[], const char *const suit[] ) { int card, row, col; for(card = 1; card <= 52; card++ ) { for(row = 0; row <= 3; row++) { for(col = 0; col <= 12; col++) { if(deck[row][col] == card) { printf( %5s of %-8s%c, face[col], suit[row], (card % 3) == 0? \n : \t ); Πρατικάκης (CSD) Pointers II CS100, 2016-2017 9 / 18

Παράδειγμα: Τραπουλόχαρτα (2) Έξοδος Four of Hearts King of Clubs Seven of Diamonds Ten of Diamonds Ace of Diamonds Nine of Spades Ace of Clubs King of Hearts Eight of Diamonds Six of Spades Jack of Clubs Seven of Spades Three of Diamonds Jack of Diamonds Seven of Clubs Six of Clubs Ten of Hearts Eight of Spades Jack of Spades Deuce of Diamonds King of Spades Queen of Clubs Deuce of Hearts Three of Spades Five of Spades Nine of Hearts Ten of Clubs Six of Diamonds Five of Clubs Nine of Clubs Five of Diamonds Four of Spades Deuce of Spades Three of Hearts Four of Diamonds Jack of Hearts Eight of Clubs Queen of Spades Nine of Diamonds Four of Clubs Five of Hearts Queen of Hearts Deuce of Clubs Three of Clubs Ace of Hearts Ace of Spades Seven of Hearts King of Diamonds Eight of Hearts Six of Hearts Queen of Diamonds Ten of Spades Πρατικάκης (CSD) Pointers II CS100, 2016-2017 10 / 18

Δείκτες σε Συναρτήσεις Δείκτης σε συνάρτηση (function pointer) Περιέχει τη διεύθυνση των εντολών της συνάρτησης Όπως ένας δείκτης δείχνει στο πρώτο στοιχείο ενός πίνακα Πού χρειάζονται Πολλές φορές δεν ξέρουμε ποιά συνάρτηση θέλουμε να καλέσουμε μέχρι να τρέξουμε το πρόγραμμα Πχ, αν η συνάρτηση που πρέπει να καλέσουμε καθορίζεται από την είσοδο Πολλές φορές χρησιμοποιούμε συναρτήσεις βιβλιοθήκης οι οποίες πρέπει να καλούν διαφορετικές υποσυναρτήσεις ανάλογα με την είσοδο που τους δίνουμε Πχ, μια συνάρτηση minimum χρησιμοποιεί άλλη σύγκριση για strings και άλλη σύγκριση για αριθμούς Τους δίνουμε ως παράμετρο τη συνάρτηση που θα καλέσουν ώστε να μη χρειάζεται να τις ξαναμεταγλωττίσουμε Απαραίτητες πολλές φορές για κατανοητό, ευανάγνωστο ή γρήγορο κώδικα Βοηθούν να αποφύγουμε τις πολλές if και switch Πρατικάκης (CSD) Pointers II CS100, 2016-2017 11 / 18

Δείκτες σε συναρτήσεις (2) Χρήσεις των δεικτών σε συναρτήσεις Περνώνται ως ορίσματα συναρτήσεων Αποθηκεύονται σε μεταβλητές και πίνακες Διαφορές με τους υπόλοιπους δείκτες Μπορούμε να καλέσουμε τη συνάρτηση που δείχνει ένας δείκτης (*function_pointer)(argument1, argument2) Καλείται η συνάρτηση που δείχνει ο δείκτης με αυτά τα ορίσματα Αναθέτουμε τη διεύθυνση μιας συνάρτησης (όχι μιας μεταβλητής) function_pointer = &main; Πρατικάκης (CSD) Pointers II CS100, 2016-2017 12 / 18

Δήλωση δεικτών σε συναρτήσεις Παραδείγματα δήλωσης int (*funptr1)(int, int); int *funptr2(int, int); int (*funptr3[10])(int, int); Η funptr1 είναι μια μεταβλητή με τύπο δείκτη σε συνάρτηση που παίρνει δύο ορίσματα τύπου int και επιστρέφει int Η funptr2 είναι μια συνάρτηση που παίρνει δύο ορίσματα int και επιστρέφει ένα δείκτη σε int Η funptr3 είναι ένας πίνακας που περιέχει 10 δείκτες: κάθε ένας δείχνει σε μια συνάρτηση που παίρνει δύο ορίσματα int και επιστρέφει int Πρατικάκης (CSD) Pointers II CS100, 2016-2017 13 / 18

Παράδειγμα fun-ptrc #include<stdioh> int f(int a, int b) { return a * b; int main(void) { int (*funptr)(int, int); funptr = &f; printf( Calling f(3,5) returns %d\n, (*funptr)(3, 5)); return 0; Πρατικάκης (CSD) Pointers II CS100, 2016-2017 14 / 18

Παράδειγμα: Bubblesort Η bubblesort που είδαμε ταξινομεί ακέραιους (int) σε αύξουσα σειρά χρησιμοποιώντας τον τελεστή < για να τους συγκρίνει μεταξύ τους Πώς θα αλλάξει ώστε να παίρνει ως όρισμα μια συνάρτηση σύγκρισης και να καλεί αυτή; Πώς θα την καλέσουμε για να κάνει αύξουσα ή φθίνουσα ταξινόμηση; Πρατικάκης (CSD) Pointers II CS100, 2016-2017 15 / 18

Παράδειγμα: Bubblesort (2) bubblesort2c #include<stdioh> #define SIZE 10 void bubble(int [], const int, int(*)(int, int)); int less(int, int); int more(int, int); void swap(int *, int *); int main(void) { int order, i, a[size] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 ; int (*comparison)(int, int); char *order_name; printf( Press 1 to use ascending order\n Press 2 to use descending order: ); do { order = getchar(); while (order!= 1 && order!= 2 ); if(order == 1 ) { comparison = &more; order_name = ascending ; else { comparison = &less; order_name = descending ; printf( Data in original order:\n ); for(i = 0; i < SIZE; i++) { printf( %5d, a[i]); bubble(a, SIZE, comparison); printf( \ndata in %s order:\n, order_name); for(i = 0; i < SIZE; i++) { printf( %5d, a[i]); printf( \n ); return 0; Πρατικάκης (CSD) Pointers II CS100, 2016-2017 16 / 18

Παράδειγμα: Bubblesort (3) bubblesort2c void bubble(int work[], const int size, int (*compare)(int, int)) { int pass, i; for(pass = 1; pass < size; pass++) { for(i = 0; i < size - 1; i++) { if( (*compare)(work[i], work[i + 1]) ) { swap(&work[i], &work[i + 1]); int less(int a, int b) { return a < b; int more(int a, int b) { return a > b; void swap(int *p1, int *p2) { int hold = *p1; *p1 = *p2; *p2 = hold; Πρατικάκης (CSD) Pointers II CS100, 2016-2017 17 / 18

Παράδειγμα: Bubblesort (4) Έξοδος (1) Press 1 to use ascending order Press 2 to use descending order: 1 Data in original order: 2 6 4 8 10 12 89 68 45 37 Data in ascending order: 2 4 6 8 10 12 37 45 68 89 Έξοδος (2) Press 1 to use ascending order Press 2 to use descending order: 2 Data in original order: 2 6 4 8 10 12 89 68 45 37 Data in descending order: 89 68 45 37 12 10 8 6 4 2 Πρατικάκης (CSD) Pointers II CS100, 2016-2017 18 / 18