ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ -150 Προγραμματισμός Δείκτες (Pointers) (1/2)

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Το αλφαριθμητικό (string)
Advertisements

Τύποι δεδομένων και τελεστές,
POINTERS, AGGREGATION, COMPOSITION. POINTERS TO OBJECTS.
Δείκτες, Πίνακες και Δείκτες, Δείκτες σε Συναρτήσεις
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα.
Αναδρομη και static Γραψετε την συναρτηση sequence_size που διαβαζει μια απροσδιοριστου μεγεθους σειρας και υπολογιζει και τυπωνει το μεγεθος της. int.
Αντικειμενοστραφής Προγραμματισμός
Μάθημα : Βασικά Στοιχεία της Γλώσσας Java
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΙΑΔΙΚΑΣΤΙΚΟ ΠΡΟΓΡΑΜMΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ – ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ.
ΜΑΘ-3122/106 Προγραμματισμός
ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ Διάλεξη 4: Δείκτες, συναρτήσεις και διαδικασίες Εαρινό εξάμηνο 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ.
MΑΘ 106/3122 Ξ. Ζαμπούλης ΜΑΘ 106/3122 Γλώσσα Προγραμματισμού Αλφαριθμητικά (Strings)
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πίνακες Κλάσεις και Αντικείμενα.
Συναρτήσεις Κληση/Επιστροφη Παραμετροι
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Φροντιστήρια Εισηγητής: Σπύρος Αργυρόπουλος Μέλος ΕΤΕΠ Εργαστήριο Προγραμματισμού & Τεχνολογίας Ευφυών Συστημάτων.
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος γ
NIKOΛΑΟΣ ΝΤΙΡΛΗΣ 5ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΙΘΟΥΣΑ Β4 1.  Ένα thread έχει: ID, program counter, register set, stack  Μοιράζεται με τα άλλα threads της ίδιας διεργασίας.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ Διάλεξη 3: Δείκτες Εαρινό εξάμηνο 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ι. Σαρρής, τηλ.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ-150 Προγραμματισμός Αλγόριθμοι και Προγράμματα.
Δείκτες, Πίνακες σε Δείκτες, Δείκτες σε Συναρτήσεις
ΣΥΝΑΡΤΗΣΕΙΣ.
Προγραμματισμός ΙΙ Διάλεξη #5: Εντολές Ανάθεσης Εντολές Συνθήκης Δρ. Νικ. Λιόλιος.
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ-150 Προγραμματισμός Δυναμική Διαχείριση Μνήμης (1/2)
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές.
MΑΘ 106/3122Ξενοφών Ζαμπούλης ΜΑΘ 106/3122 Γλώσσα Προγραμματισμού Δείκτες (Pointers)
ΗΥ150 – Προγραμματισμός Ξ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Δομές Δεδομένων.
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ -150 Προγραμματισμός Εντολές Ελέγχου Ροής.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
Δρ. Μαρία Ι. Ανδρέου Εισαγωγή στον Αντικειμενόστρεφη Προγραμματισμό (Object-Oriented Programming) Data Types, Variables, and Arithmetic.
ΜΑΘ3122/106 – Γλώσσα προγραμματισμούΞενοφών Ζαμπούλης ΜΑΘ3122/106 Γλώσσα προγραμματισμού Συναρτήσεις.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 Δείκτες σε συναρτήσεις Δείκτης σε συνάρτηση – Περιέχει τη διεύθυνση του κώδικα της συνάρτησης – Ό π ως ένας.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές.
2/28/00epl-1311 Παραδειγματα Aλγοριθμων Αριθμος λεξεων που διαβαστηκαν απο εισοδο Εκτυπωση περιφερειας τετραγωνων με * Υπολογισμος exp(x,n) = 1 + x/1!
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ -150 Προγραμματισμός Αρχεία.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ -150 Προγραμματισμός Δομές Δεδομένων.
ΗΥ150 – ΠρογραμματισμόςΞ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Αρχεία.
HY150Ξενοφών Ζαμπούλης HY150 Ε π ι π λέον στοιχεία της C.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Δυναμική Διαχείριση Μνήμης (1/2)
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ -150 Προγραμματισμός Τύ π οι Μεταβλητών Τελεστές Βασική Είσοδος / Έξοδος.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Πίνακες (Arrays)
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αλφαριθμητικά (Strings)
Γενική Δομή Προγράμματος Λίστα από συναρτήσεις - main() Τύπος-επιστρεφόμενης-τιμής όνομα(λίστα-παραμέτρων) { δηλώσεις μεταβλητών λίστα εντολών } /*Επιστρέφει.
ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 getchar() /* char_count.c A program to count characters of input. */ main() { int c ; int count = 0; while.
ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
Βασικά στοιχεία της Java
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις (μέρος δεύτερο) και Μεταβλητές.
ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Δείκτες (Pointers) (1/2)
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ -150 Προγραμματισμός Αλγόριθμοι και Προγράμματα.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
ΔΠΘ-ΤΜΗΜΑ ΜΠΔ: ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ 1 Εισαγωγή στη γλώσσα Προγραμματισμού C ΠΙΝΑΚΕΣ (arrays)
Εισαγωγή στον Προγ/μό Η/Υ
Αντικειμενοστραφής Προγραμματισμός ΙΙ
Αντικειμενοστραφής Προγραμματισμός ΙΙ
Βασικές Έννοιες Εισόδου-Εξόδου Πίνακες και Δείκτες
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Δείκτες 1/4 Σύμβαση Τελεστής &
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Ταξινόμηση Ορισμός: Δοθέντων των στοιχείων a1,a2,… ,an η ταξινόμηση συνίσταται στην αντιμετάθεση της θέσης των στοιχείων ώστε να τοποθετηθούν με μια νέα.
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
ΗΥ-150 Προγραμματισμός Αναδρομή (1/2).
Συναρτήσεις στη C++ ΠΕΡΙΕΧΟΜΕΝΑ Εισαγωγή
Τύποι δεδομένων και τελεστές,
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Μεταγράφημα παρουσίασης:

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ -150 Προγραμματισμός Δείκτες (Pointers) (1/2)

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 2 Δείκτες Τι είναι : – τύ π ος μεταβλητών ( ό π ως integer) Τι α π οθηκεύουν : – την διεύθυνση στη μνήμη άλλων μεταβλητών Τι χρειάζονται : – Κυρίως, για δυναμική διαχείριση μνήμης και δυναμικές δομές δεδομένων – Call-by-reference – Στενή σχέση με τους π ίνακες Πηγή π ολλών λαθών π ου δύσκολα ανιχνεύονται

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 3 Δείκτες int Counter = 7; int *PointerToCounter; PointerToCounter = &Counter; ΌνομαΘέση Μνήμης Τιμή …… Counter …… PointerToCounter count 7 7 countPtr

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 4 Δήλωση Δεικτών : Το * χρησιμο π οιείται για να δηλώσει δείκτη int *myPtr; – Ορίζει δείκτη σε int (pointer of type int * ) Δήλωση π ολλών μεταβλητών τύ π ου δείκτη α π αιτεί τη χρήση ενός * μ π ροστά α π ό κάθε μία : int *myPtr1, *myPtr2; Μ π ορούμε να δηλώσουμε δείκτη σε ο π οιοδή π οτε είδος μεταβλητής ( ακόμα και άλλο δείκτη ) double *myPtr2; char **myPtr2;

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 5 Τελεστές Δεικτών & μεταβλητή – q = &a; – Ε π έστρεψε την διεύθυνση στην ο π οία είναι α π οθηκευμένη η μεταβλητή * δείκτης – a = *q; – Ε π έστρεψε τα π εριεχόμενα της διεύθυνσης στην ο π οία δείχνει ο δείκτης

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 6 Τελεστές Δεικτών & (address operator) int y = 5; int *yPtr; yPtr = &y; // O yPtr παίρνει την διεύθυνση y yPtr y 5 yptr y 5 Η διεύθυνση του y είναι η τιμή της yptr

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 7 Τελεστές Δεικτών * (indirection/dereferencing operator) int y = 5; int *yPtr; yPtr = &y; *yPtr = *yPtr * 2; – Μ π ορώ να αλλάζω την τιμή των μεταβλητών με τη βοήθεια δεικτών – Η τιμή του y γίνεται ίση με 10 – Η μεταβλητή y αλλάζει τιμή, χωρίς στον κώδικα να φαίνεται αυτό άμεσα σε μια εντολή π ου εμφανίζει την y! – H y δηλαδή, α π οκτά ένα « ψευδώνυμο »: το *yPtr * και & είναι ανά π οδα και αλληλοακυρώνονται

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1/* 2 Using the & and * operators */ 3#include 4 5int main() 6{6{ 7 int a; /* a is an integer */ 8 int *aPtr; /* aPtr is a pointer to an integer */ 9 10 a = 7; 11 aPtr = &a; /* aPtr set to address of a */ printf( "The address of a is %p" 14 "\nThe value of aPtr is %p", &a, aPtr ); printf( "\n\nThe value of a is %d" 17 "\nThe value of *aPtr is %d", a, *aPtr ); printf( "\n\nShowing that * and & are inverses of " 20 "each other.\n&*aPtr = %p" 21 "\n*&aPtr = %p\n", &*aPtr, *&aPtr ); return 0; 24} The address of a is 0012FF88 The value of aPtr is 0012FF88 The value of a is 7 The value of *aPtr is 7 Proving that * and & are complements of each other. &*aPtr = 0012FF88 *&aPtr = 0012FF88 The address of a is the value of aPtr. The * operator returns an alias to what its operand points to. aPtr points to a, so *aPtr returns a. Notice how * and & are inverses

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1/* 2 Cube a variable using call-by-reference 3 with a pointer argument */ 4 5#include 6 7void cubeByReference( int * ); /* prototype */ 8 9int main() 10{ 11 int number = 5; printf( "The original value of number is %d", number ); 14 cubeByReference( &number ); 15 printf( "\nThe new value of number is %d\n", number ); return 0; 18} 19 20void cubeByReference( int *nPtr ) 21{ 22 *nPtr = *nPtr * *nPtr * *nPtr; /* cube number in main */ 23} The original value of number is 5 The new value of number is 125 Notice how the address of number is given - cubeByReference expects a pointer (an address of a variable). Inside cubeByReference, *nPtr is used ( *nPtr is number ). Notice that the function prototype takes a pointer to an integer ( int * ).

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 10 Bubble Sort με χρήση της Swap void swap( int *n1, int *n2) { int temp; temp = *n1; *n1 = *n2; *n2 = temp; } int x = 10, y=20; swap(&x,&y);

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1/* Fig. 7.15: fig07_15.c 2 This program puts values into an array, sorts the values into 3 ascending order, and prints the resulting array. */ 4#include 5#define SIZE 10 6void bubbleSort( int *, const int ); 7 8int main() 9{9{ int a[ SIZE ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }; 12 int i; printf( "Data items in original order\n" ); for ( i = 0; i < SIZE; i++ ) 17 printf( "%4d", a[ i ] ); bubbleSort( a, SIZE ); /* sort the array */ 20 printf( "\nData items in ascending order\n" ); for ( i = 0; i < SIZE; i++ ) 23 printf( "%4d", a[ i ] ); printf( "\n" ); return 0; 28} 29 30void bubbleSort( int *array, const int size ) 31{ 32 sort gets passed the address of array elements (pointers). The name of an array is a pointer. void swap( int *, int * );

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 33 int pass, j; 34 for ( pass = 0; pass < size - 1; pass++ ) for ( j = 0; j < size - 1; j++ ) if ( array[ j ] > array[ j + 1 ] ) 39 swap( &array[ j ], &array[ j + 1 ] ); 40} 41 42void swap( int *element1Ptr, int *element2Ptr ) 43{ 44 int hold = *element1Ptr; 45 *element1Ptr = *element2Ptr; 46 *element2Ptr = hold; 47} Data items in original order Data items in ascending order

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 13 Αριθμητική Δεικτών Στους δείκτες μ π ορούμε να π ραγματο π οιούμε αριθμητικές π ράξεις : – ++ ή –- Ο δείκτης δείχνει στο ε π όμενο ή π ροηγούμενο αντικείμενο, δηλ. αν είναι δείκτης σε ακέραιο στον ε π όμενο ή π ροηγούμενο ακέραιο – Αντίστοιχα για + ή +=, - ή -= – Οι δείκτες μ π ορούν να αφαιρούνται ο ένας α π ό τον άλλο – Όλες αυτές οι π ράξεις δεν έχουν νόημα εκτός αν π ραγματο π οιούνται π άνω δείκτη π ου δείχνει στα στοιχεία ενός π ίνακα

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 14 Αριθμητική Δεικτών Πίνακας 5 στοιχείων τύ π ου int σε μηχανή με 4 byte int s – int v[5]; – int *vPtr; vPtr = &v[0] ή vPtr = v; // δείχνει στο π ρώτο στοιχείο v[0] // vPtr στο 3000 – vPtr += 2; // vPtr στο 3008 vPtr δείχνει στο v[ 2 ] ( αύξηση κατά 2), μια και η μηχανή έχει 4 byte int s, ο π ότε δείχνει 3008 pointer variable vPtr v[0]v[1]v[2]v[4]v[3] location

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 15 Σχέση μεταξύ π ινάκων και δεικτών – Στοιχείο b[ 3 ] Μ π ορούμε να το π άρουμε σαν *( bPtr + 3 ) Σαν bPtr[ 3 ] – bPtr[ 3 ] == b[ 3 ] Με αριθμητική δεικτών : *( b + 3 )

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 16 Διεύθυνση Πινάκων και Δείκτες int *a; a δείκτης σε ακέραιο Δεσμεύεται μνήμη μόνο για την α π οθήκευση του a ( της διεύθυνσης ) Μ π ορούμε να αλλάξουμε την διεύθυνση π ου δείχνει ο a int b[10]; b σταθερή διεύθυνση ( δείκτης ) σε ακέραιο Δεσμεύεται μνήμη για 10 ακέραιους Δεν μ π ορούμε να αλλάξουμε την διεύθυνση στην ο π οία αντιστοιχεί ο b

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 17 Πίνακες και Δείκτες Μ π ορούμε να π ερνάμε δείκτες σε συναρτήσεις π ου π εριμένουν π ίνακες και αντίστροφα. Σε κάθε π ερί π τωση π ερνάμε α π λώς μία διεύθυνση μνήμης. Το π αρακάτω γίνεται δεκτό : void f(int a[]); void q(int *b); int main() { int *c; int d[10]; f(c); q(d) } ΠΡΟΣΟΧΗ ! με την δέσμευση της μνήμης σε κάθε π ερί π τωση.

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 18 Παράδειγμα - ptrarithm2.c int n[10] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 1}, *p, c; // First way to traverse the array printf("First way to index the array.\n"); for (c=0; c < 10; c++) printf("n[%d] = %d\n", c, n[c]); printf("\nSecond way to index the array, through pointer arithmetic.\n"); for (c=0; c < 10; c++) printf("n[%d] = %d\n", c, *(n+c)); printf("\nThird way to index the array, through pointers arithmetic.\n"); // We set the pointer to the beginning of the array p = n; for (c=0; c < 10; c++) printf("n[%d] = %d\n", c, *(p+c)); printf("\nFourth way to index the array, through pointers arithmetic.\n"); p = n; for (c=0 ; c < 10; c++) printf("n[%d] = %d, %d\n", c, *(p++), p);

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ -150 Προγραμματισμός Δείκτες (Pointers) (2/2)

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 20 Μετατρο π ή Τύ π ων και Δείκτες Ο τύ π ος του αντικειμένου στο ο π οίο δείχνει ο δείκτης χρειάζεται για την σωστή αριθμητική δεικτών Όλοι οι δείκτες, ανεξάρτητα του αντικειμένου π ου δείχνουν, α π αιτούν την ίδια μνήμη για την α π οθήκευσή τους Η μετατρο π ή τύ π ων α π ό ένα τύ π ο δείκτη σε άλλο τύ π ο δείκτη δεν αλλάζει τα π εριεχόμενα του δείκτη : – int *aPtr; – float *bPtr; – aPtr = (int *)bPtr;

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 21 Παραδείγματα – types.c, types2.c //types.c #include int main() { int *a; double *b; float *c; float (*d)[10]; float da[10]; printf("Size of a = %d\n", sizeof(a)); printf("Size of b = %d\n", sizeof(b)); printf("Size of c = %d\n", sizeof(c)); printf("Size of d = %d\n", sizeof(d)); printf("Size of *d = %d\n", sizeof(*d)); printf("Size of da = %d\n", sizeof(da)); return 0; } //types2.c #include int main() { int *a,n,array[10]; double *b; // Doing pointer arithmetic on a as an int * a = array; for (n=0; n < 10; n++) printf("Address of a is %d\n", a++); putchar('\n'); // Doing pointer arithmetic on b as an double * // Notice that if I try to access the *b I may get // a segmentation fault here, 'cause b points out of // the array b = (double *)array; for (n=0; n < 10; n++) printf("Address of b is %d\n", b++); return 0; }

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 22 Χρήση του const με δείκτες const qualifier – Η μεταβλητή δεν αλλάζει – Χρησιμο π οιείστε το const αν η συνάρτηση δεν χρειάζεται να αλλάζει τη μεταβλητή – Η π ροσ π άθεια αλλαγής μιας const μεταβλητής π αράγει λάθος const pointers – Δείχνει σε μια σταθερή διεύθυνση μνήμης – Πρέ π ει να αρχικο π οιείται όταν δηλώνεται : – int *const myPtr = &x; Type int *const – constant pointer to an int – const int *myPtr = &x; Regular pointer to a const int – const int *const Ptr = &x; const pointer to a const int x can be changed, but not *Ptr

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1/* 2 Attempting to modify a constant pointer to 3 non-constant data */ 4 5#include 6 7int main() 8{8{ 9 int x, y; int * const ptr = &x; /* ptr is a constant pointer to an 12 integer. An integer can be modified 13 through ptr, but ptr always points 14 to the same memory location. */ 15 *ptr = 7; 16 ptr = &y; return 0; 19} Error E2024 FIG07_13.c 16: Cannot modify a const object in function main *** 1 errors in Compile *** Changing *ptr is allowed – x is not a constant. Changing ptr is an error – ptr is a constant pointer.

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 24 Πίνακες α π ό δείκτες Ένας π ίνακας μ π ορεί να π εριέχει και δείκτες Παράδειγμα : ένας π ίνακας α π ό strings char *suit[ 4 ] = { "Hearts", "Diamonds", "Clubs", "Spades" }; – Περιέχει δείκτες στον 1 ο κάθε φορά χαρακτήρα – char * – κάθε στοιχείο του suit είναι δείκτης σε char – Τα strings στην π ραγματικότητα δεν α π οθηκεύονται στον π ίνακα suit, μόνο δείκτες α π οθηκεύονται στον π ίνακα – Το suit έχει σταθερό μέγεθος ( ως π ίνακας άλλωστε ), αλλά τα αλφαριθμητικά μ π ορούν να έχουν ό π οιο μέγεθος ε π ιθυμούμε suit[3] suit[2] suit[1] suit[0]’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’

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 25 Παράδειγμα : Ανακάτεμα και μοίρασμα τρά π ουλας

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 2 3#include 4#include 5#include 6 7void shuffle( int [][ 13 ] ); 8void deal( const int [][ 13 ], const char *[], const char *[] ); 9 10int main() 11{ 12 const char *suit[ 4 ] = 13 { "Hearts", "Diamonds", "Clubs", "Spades" }; 14 const char *face[ 13 ] = 15 { "Ace", "Deuce", "Three", "Four", 16 "Five", "Six", "Seven", "Eight", 17 "Nine", "Ten", "Jack", "Queen", "King" }; 18 int deck[ 4 ][ 13 ] = { 0 }; srand( time( 0 ) ); shuffle( deck ); 23 deal( deck, face, suit ); return 0; 26} 27 28void shuffle( int wDeck[][ 13 ] ) 29{ 30 int row, column, card; for ( card = 1; card <= 52; card++ ) {

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 33 do { 34 row = rand() % 4; 35 column = rand() % 13; 36 } while( wDeck[ row ][ column ] != 0 ); wDeck[ row ][ column ] = card; 39 } 40} 41 42void deal( const int wDeck[][ 13 ], const char *wFace[], 43 const char *wSuit[] ) 44{ 45 int card, row, column; for ( card = 1; card <= 52; card++ ) for ( row = 0; row <= 3; row++ ) for ( column = 0; column <= 12; column++ ) if ( wDeck[ row ][ column ] == card ) 54 printf( "%5s of %-8s%c", 55 wFace[ column ], wSuit[ row ], 56 card % 2 == 0 ? '\n' : '\t' ); 57} card % 2 == 0 ? '\n' : '\t' ); 57} The numbers 1-52 are randomly placed into the deck array showing the position of card wDeck[row][column]. Searches deck for the card number, then prints the face and suit.

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης Six of Clubs Seven of Diamonds Ace of Spades Ace of Diamonds Ace of Hearts Queen of Diamonds Queen of Clubs Seven of Hearts Ten of Hearts Deuce of Clubs Ten of Spades Three of Spades Ten of Diamonds Four of Spades Four of Diamonds Ten of Clubs Six of Diamonds Six of Spades Eight of Hearts Three of Diamonds Nine of Hearts Three of Hearts Deuce of Spades Six of Hearts Five of Clubs Eight of Clubs Deuce of Diamonds Eight of Spades Five of Spades King of Clubs King of Diamonds Jack of Spades Deuce of Hearts Queen of Hearts Ace of Clubs King of Spades Three of Clubs King of Hearts Nine of Clubs Nine of Spades Four of Hearts Queen of Spades Eight of Diamonds Nine of Diamonds Jack of Diamonds Seven of Clubs Five of Hearts Five of Diamonds Four of Clubs Jack of Hearts Jack of Clubs Seven of Spades

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 29 Δείκτες σε συναρτήσεις Δείκτης σε συνάρτηση – Περιέχει τη διεύθυνση του κώδικα της συνάρτησης – Ό π ως ένας δείκτης δείχνει στο 1 ο στοιχείο ενός π ίνακα Γιατί ; – Πολλές φορές δεν ξέρουμε τη συνάρτηση θέλουμε να καλέσουμε, μέχρι να τρέξουμε το π ρόγραμμα (π. χ., αν η συνάρτηση π ου π ρέ π ει να καλέσουμε καθορίζεται α π ό την είσοδο ). – Πολλές φορές π ρογραμματίζουμε ή χρησιμο π οιούμε συναρτήσεις βιβλιοθήκης οι ο π οίες χρησιμο π οιούν άλλες υ π οσυναρτήσεις. Οι τελευταίες μ π ορεί να π ρομηθεύονται α π ό τον χρήστη της βιβλιοθήκης, ώστε να αλλάζουν την συμ π εριφορά της συνάρτησης, χωρίς να χρειάζεται να την ξαναμεταγλωττίσουμε. – Α π αραίτητες π ολλές φορές για κατανοητό, ευανάγνωστο ή γρήγορο κώδικα. Α π οφεύγουμε τις π ολλές if/switch

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 30 Δείκτες σε συναρτήσεις Οι δείκτες σε συναρτήσεις – Τα π ερνάμε σαν ορίσματα σε συναρτήσεις – Α π οθηκεύονται σε π ίνακες – Εκχωρούνται σε άλλους δείκτες – Διαφορά 1 α π ό τους υ π όλοι π ους δείκτες : «π ρόσβαση » στα π εριεχόμενά τους : *functionPtr (*functionPtr)(argument1, argument2) Σε αυτήν την π ερί π τωση καλείται η συνάρτηση της ο π οίας η διεύθυνση είναι α π οθηκευμένη στον δείκτη – Διαφορά 2 α π ό τους υ π όλοι π ους δείκτες : ανάθεση διεύθυνσης μιας συνάρτησης και όχι μεταβλητής functionPtr = &afunction;

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 31 Δήλωση Δεικτών σε Συναρτήσεις int (*funPtr)(int, int) – Ο τύ π ος της μεταβλητής funPtr είναι « δείκτης σε συνάρτηση π ου π αίρνει δύο ορίσματα τύ π ου int, και ε π ιστρέφει int. int *funPtr(int, int) – Αυτό θα σήμαινε, ότι το funPtr είναι τύ π ου « συνάρτηση π ου π αίρνει δύο ορίσματα τύ π ου int, και ε π ιστρέφει δείκτη σε int) int (*funPtrarray[10])(int, int)) – Τυ π ος του funPtrarray: π ίνακας α π ό 10 δείκτες σε συναρτήσεις π ου π αίρνουν δύο ορίσματα τύ π ου int και ε π ιστρέφουν int

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 32 Παραδείγματα int function(int a, int b) { return a*b; } int main() { int (*funPtr)(int, int); funPtr = &function; printf(“Calling the function returns %d\n”, (*funPtr)(4, 5)); return 0; } Δήλωση του δείκτη σε συνάρτηση Ανάθεση της διεύθυνσης μιας συνάρτησης Κλήση της συνάρτησης που είναι αποθηκευμένη στον δείκτη

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 33 Παράδειγμα Θυμηθείτε ότι η BubbleSort ταξινομεί ακεραίους βασιζόμενη σε συγκρίσεις μεταξύ τους. Αλλάξτε την BubbleSort ώστε να π αίρνει ως όρισμα την συνάρτηση σύγκρισης δύο ακεραίων και να την χρησιμο π οιεί για ταξινόμηση. Καλέστε την BubbleSort έτσι ώστε να ταξινομεί ακεραίους και κατά αύξοντα σειρά και κατά φθίνουσα

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 2 3#include 4#define SIZE 10 5void bubble( int [], const int, int (*)( int, int ) ); 6int ascending( int, int ); 7int descending( int, int ); 8 9int main() 10{ int order, 13 counter, 14 a[ SIZE ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }; printf( "Enter 1 to sort in ascending order,\n" 17 "Enter 2 to sort in descending order: " ); 18 scanf( "%d", &order ); 19 printf( "\nData items in original order\n" ); for ( counter = 0; counter < SIZE; counter++ ) 22 printf( "%5d", a[ counter ] ); if ( order == 1 ) { 25 bubble( a, SIZE, &ascending ); 26 printf( "\nData items in ascending order\n" ); 27 } 28 else { 29 bubble( a, SIZE, &descending ); 30 printf( "\nData items in descending order\n" ); 31 } 32 Notice the function pointer parameter.

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 33 for ( counter = 0; counter < SIZE; counter++ ) 34 printf( "%5d", a[ counter ] ); printf( "\n" ); return 0; 39} 40 41void bubble( int work[], const int size, 42 int (*compare)( int, int ) ) 43{ 44 int pass, count; void swap( int *, int * ); for ( pass = 1; pass < size; pass++ ) for ( count = 0; count < size - 1; count++ ) if ( (*compare)( work[ count ], work[ count + 1 ] ) ) 53 swap( &work[ count ], &work[ count + 1 ] ); 54} 55 56void swap( int *element1Ptr, int *element2Ptr ) 57{ 58 int temp; temp = *element1Ptr; 61 *element1Ptr = *element2Ptr; 62 *element2Ptr = temp; 63} 64 ascending and descending return true or false. bubble calls swap if the function call returns true. Notice how function pointers are called using the dereferencing operator. The * is not required, but emphasizes that compare is a function pointer and not a function.

ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 65int ascending( int a, int b ) 66{ 67 return b < a; /* swap if b is less than a */ 68} 69 70int descending( int a, int b ) 71{ 72 return b > a; /* swap if b is greater than a */ 73} Enter 1 to sort in ascending order, Enter 2 to sort in descending order: 1 Data items in original order Data items in ascending order Enter 1 to sort in ascending order, Enter 2 to sort in descending order: 2 Data items in original order Data items in descending order }