SlideShare une entreprise Scribd logo
1  sur  34
Télécharger pour lire hors ligne
H ΓΛΩΣΣΑ C
Μάθηµα 8:
∆είκτες
∆ηµήτρης Ψούνης
Περιεχόµενα Μαθήµατος
Α. ∆είκτες
1. Η µνήµη του υπολογιστή
2. Η έννοια του δείκτη
3. Ορισµός ∆είκτη
4. Απόδοση τιµής σε δείκτη (Ο τελεστής &)
5. Απόδοση τιµής µέσω δείκτη (ο τελεστής *)
6. Παράδειγµα χρήσης δείκτη
Β. ∆είκτες και Πίνακες
1. Το όνοµα ενός πίνακα είναι δείκτης
2. Αποθήκευση ενός πίνακα στη µνήµη
3. Αριθµητική ∆εικτών
4. Ισοδύναµος Συµβολισµός για πρόσβασή σε πίνακα
Γ. ∆είκτες και Συναρτήσεις
1. ∆ιοχέτευση ∆είκτη σε Συνάρτηση
2. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση µέσω Τιµής
3. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση µέσω Αναφοράς
∆. Παρατηρήσεις
1. ∆ιοχέτευση πίνακα ως όρισµα σε συνάρτηση
2. Η Σταθερά NULL
Ασκήσεις
2∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
A. ∆είκτες
1. Η Μνήµη του Υπολογιστή
3∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Έχουµε ήδη δει κάποιες πληροφορίες για την οργάνωση της µνήµης σε ένα πρόγραµµα.
Σε µια απλουστευµένη (αλλά επαρκή) προσέγγιση µπορούµε να φανταστούµε την µνήµη σαν
µια ταινία µε χώρους αποθήκευσης δεδοµένων.
Κάθε χώρος αποθήκευσης είναι 1 byte (δηλαδή 8 bits).
Προκειµένου να µπορούµε να εντοπίσουµε κάθε χώρο αποθήκευσης, έχει έναν
αναγνωριστικό αύξων αριθµό (που λέγεται διεύθυνση µνήµης).
Έτσι η εικόνα που πρέπει να έχουµε για την µνήµη θα είναι κελιά, το κάθε ένα µε έναν
αναγνωριστικό αριθµό, το οποίο θα έχει µέγεθος 1 byte:
1Byte
0
…
1 2 1000 1001
…
10000 10001
…
2x109
1Byte 1Byte 1Byte 1Byte 1Byte 1Byte 1Byte
A. ∆είκτες
1. Η Μνήµη του Υπολογιστή
4∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Είδαµε ότι µια συνάρτηση έχει τον δικό της χώρο αποθήκευσης µεταβλητών.
Όταν πρόκειται να εκτελεστεί µια συνάρτηση, δεσµεύεται ο χώρος της µνήµης για τις
µεταβλητές της συνάρτησης.
Έτσι αν για παράδειγµα η main καλεί µια συνάρτηση που έχουµε γράψει (έστω µε όνοµα
f), τότε ο µεταγλωττιστής θα µεριµνήσει ώστε κάθε συνάρτηση να έχει τον χώρο της στην
µνήµη.
Ο χώρος που δεσµεύεται είναι αρκετά µεγάλος για να χωρέσει πάρα πολλές µεταβλητές
(το ακριβές πλήθος καθορίζεται από το λειτουργικό σύστηµα, το µεταγλωττιστή κ.λπ.)
…
1000 1001
…
15448 15449
…
1002
Χώρος της f Χώρος της main
…… …
A. ∆είκτες
1. Η Μνήµη του Υπολογιστή
5∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Όταν δηλώνουµε µεταβλητές σε µια συνάρτηση, ο µεταγλωττιστής επιλέγει κάποιον από τον
ελεύθερο χώρο της συνάρτησης για να αποθηκεύσει την µεταβλητή.
Έτσι αν π.χ. η f δηλώνει στον χώρο δήλωσης µεταβλητών της δύο ακέραιες µεταβλητές, έστω
την x και την y (θεωρούµε ότι µια ακέραια µεταβλητή δεσµεύει 4 bytes όπως συζητήσαµε σε
προηγούµενο µάθηµα)
Τότε η εικόνα της µνήµης θα είναι η εξής
…
1014 1015
…
Χώρος της f Χώρος της main
… …
1016 1017 1057 1058 1059 1060
…
x y
… ……
A. ∆είκτες
1. Η Μνήµη του Υπολογιστή
6∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Έτσι αν γράψουµε x=1 και y=5 µε εντολές καταχώρησης στο σώµα της f, τότε αποθηκεύονται
στις µεταβλητές οι αντίστοιχες τιµές.
Ο τρόπος αποθήκευσης στο δυαδικό σύστηµα των αριθµών αυτών δεν µας ενδιαφέρει όταν
γράφουµε το πρόγραµµά µας.
Συνοψίζοντας αντιλαµβανόµαστε ότι µία µεταβλητή µπορεί να εντοπιστεί πλήρως από δύο
δεδοµένα: τον τύπο δεδοµένων της (για να ξέρουµε πόσα bytes δεσµεύει στην µνήµη) και το
πρώτο byte στο οποίο είναι αποθηκευµένη. Π.χ. Για την x αν ξέρω ότι είναι ακέραια και το 1ο
byte της είναι το 1014, τότε µπορώ να εξάγω ότι θα είναι αποθηκευµένη στα bytes 1014-1017.
…
1014 1015
…
Χώρος της f Χώρος της main
… …
1016 1017 1057 1058 1059 1060
…
x y
… …… 1 5
A. ∆είκτες
2. Η Έννοια του ∆είκτη
7∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Έτσι λοιπόν, η εικόνα που θα πρέπει να έχουµε στο µυαλό µας, είναι ότι κάθε µεταβλητή έχει
έναν χώρο αποθήκευσης (ίσου µε το µέγεθος της µεταβλητής σε bytes) µε αναγνωριστικό τη
διεύθυνση µνήµης του 1ου byte που αυτή δεσµεύει.
Από την στιγµή όµως που η διεύθυνση µνήµης είναι ένας αριθµός, µπορεί να αντιµετωπιστεί
σαν οποιοσδήποτε άλλος αριθµός στην C. Άρα για παράδειγµα µπορούµε να δηλώσουµε µια
µεταβλητή στην οποία να αποθηκεύουµε την διεύθυνση µνήµης µιας άλλης µεταβλητής!
…
1014
…
Χώρος της f Χώρος της main
… …
1057
…
x y
… …… 1 5
A. ∆είκτες
2. Η Έννοια του ∆είκτη
8∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Συνεπώς µπορούµε να δηλώσουµε µια µεταβλητή (έστω µε όνοµα ptr) που θα αποθηκεύσουµε
π.χ. την διεύθυνση της µεταβλητής x.
Αυτή η µεταβλητή, η οποία αποθηκεύει ως τιµή την διεύθυνση µνήµης άλλων µεταβλητών
ονοµάζεται δείκτης:
∆είτε λοιπόν ότι ο δείκτης ptr έχει ως τιµή την διεύθυνση της µεταβλητής x. Θα λέµε για το
λόγο αυτό, ότι ο δείκτης ptr δείχνει στην µεταβλητή x
…
1014
…
Χώρος της f
Χώρος της main
… …
1057
…
Μεταβλητή x ∆είκτης ptr
… …… 1 1014
A. ∆είκτες
3. Ορισµός ∆είκτη
9∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Ένας δείκτης δηλώνεται µε την εντολή δήλωσης:
∆ηλώνουµε έναν δείκτη µε όνοµα «Ονοµα_∆είκτη» που θα δείχνει σε µια µεταβλητή τύπου
δεδοµένων «Τύπος_∆εδοµένων»
Παραδείγµατα:
Εδώ δηλώνουµε έναν δείκτη σε ακέραιο µε όνοµα p.
Εδώ δηλώνουµε έναν δείκτη σε double µε όνοµα ptr
∆ιαπιστώστε ότι ένας δείκτης είναι ακόµη ένας τύπος δεδοµένων. Με την ιδιαιτερότητα ότι οι
µεταβλητές που θα αποθηκεύει θα είναι διευθύνσεις µνήµης.
Ο τύπος δεδοµένων συµβολικά είναι (int *) και (double *) αντίστοιχα στις δηλώσεις που είδαµε.
Τύπος_∆εδοµένων *Ονοµα_∆είκτη
int *p;
double *ptr;
A. ∆είκτες
4. Απόδοση Τιµής σε ∆είκτη
10∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Για να έχει νόηµα ένας δείκτης πρέπει να τον συσχετίσουµε µε µια µεταβλητή, ή όπως λέµε να
τον βάλουµε να δείχνει στην µεταβλητή. Αυτό γίνεται µε τον εξής τρόπο:
Ο τελεστής & (θα τον διαβάζουµε «διεύθυνση του») µπαίνει µπροστά από µια µεταβλητή
και µας επιστρέφει την διεύθυνση του.
Άρα:
αν η x είναι αποθηκευµένη π.χ. στην διεύθυνση 10333,
τότε η τιµή &x (διεύθυνση του x) είναι 10333,
άρα η τιµή της p µετά την εντολή ανάθεσης είναι 10333.
int x;
int *p;
p=&x; // Βάλε τον δείκτη p να δείχνει στην x.
A. ∆είκτες
5. Απόδοση Τιµής µέσω ∆είκτη (Ο τελεστής *)
11∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Ο τελεστής * (που ονοµάζεται τελεστής έµµεσης διευθυνσιοδότησης) έχει δύο χρήσεις:
Είδαµε την πρώτη που είναι να δηλώσουµε µια µεταβλητή τύπου δείκτη.
Η δεύτερη χρήση είναι η εξής:
Αν σε µία εντολή, βάλουµε το * µπροστά από έναν δείκτη, τότε αναφερόµαστε στην
µεταβλητή που δείχνει ο δείκτης.
Βλέπουµε το παράδειγµα:
Μετά από αυτό το παράδειγµα αντιλαµβανόµαστε ότι έχουµε δύο τρόπους για να έχουµε
πρόσβαση στην µεταβλητή x:
Απευθείας µε το όνοµα της x (άµεση πρόσβαση)
Μέσω του δείκτη που δείχνει στην x (έµµεση πρόσβαση)
int x;
int *p;
p=&x;
*p=5; //Η µεταβλητή που δείχνει το *p (άρα το x) παίρνει την τιµή 5
A. ∆είκτες
6. Παράδειγµα Χρήσης ∆εικτών
12∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Μεταγλωττίστε, εκτελέστε και µελετήστε το πρόγραµµα:
/* pointers.c: Deixnei tin vasiki xrisi twn deiktwn */
#include <stdio.h>
main()
{
int x;
int *ptr;
ptr=&x;
x=5;
printf("x=%dt *ptr=%dt &x=%dt ptr=%d",x,*ptr,&x,ptr);
*ptr=8;
printf("nx=%dt *ptr=%dt &x=%dt ptr=%d",x,*ptr,&x,ptr);
x=9;
printf("nx=%dt *ptr=%dt &x=%dt ptr=%d",x,*ptr,&x,ptr);
}
Β. ∆είκτες και Πίνακες
1. Το Όνοµα ενός Πίνακα είναι ∆είκτης
13∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Οι δείκτες είναι πολύ χρήσιµοι σε συνδυασµό µε τους πίνακες!
Αυτό συµβαίνει διότι εξ’ ορισµού το όνοµα κάθε πίνακα είναι ένας δείκτης µε τύπο δεδοµένων
τον τύπο δεδοµένων του πίνακα.
Ωστόσο είναι ένας δείκτης που δεν µπορούµε να αλλάξουµε την τιµή του.
Μπορούµε όµως να ορίσουµε έναν δείκτη να δείχνει στην αρχή του πίνακα µε τον εξής
τρόπο:
Ο δείκτης θα δείχνει στον πρώτο ακέραιο αριθµό του
πίνακα.
Ο δείκτης ptr µπορεί να αλλάξει!
Σηµειώστε εδώ ότι θα µπορούσαµε να βάλουµε τον δείκτη να δείχνει στο πρώτο στοιχείο
του πίνακα και µε την εντολή
Ωστόσο είναι σηµαντικό να γνωρίζουµε τον πρώτο τρόπο.
ptr=&pinakas[0]
int pinakas[100];
int *ptr;
ptr=pinakas;
int pinakas[100];
int *ptr;
ptr=&pinakas[0];
Β. ∆είκτες και Πίνακες
2. Αποθήκευση ενός Πίνακα στη Μνήµη
14∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Στο µάθηµα 8, είδαµε ότι τα στοιχεία ενός πίνακα αποθηκεύονται σε διαδοχικές θέσεις µνήµης.
Έφτασε η ώρα να το διαπιστώσουµε και πειραµατικά.
Είδαµε ότι µε την δήλωση:
∆ηµιουργείται ένας πίνακας 4 διαδοχικών θέσεων στην µνήµη
Γνωρίζουµε πλέον ότι &pin[0],&pin[1],&pin[2],&pin[3] είναι οι διευθύνσεις µνήµης των
4 µεταβλητών του πίνακα.
Το πρόγραµµα της επόµενης διαφάνειας δείχνει ότι όντως οι µεταβλητές αυτές
αποθηκεύονται σε διαδοχικές θέσεις µνήµης.
int pin[4];
Χώρος της συνάρτησης
pin[0] pin[1] pin[2]
…
pin[3]
…
Β. ∆είκτες και Πίνακες
2. Αποθήκευση ενός Πίνακα στη Μνήµη
15∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Μεταγλωττίστε, εκτελέστε και µελετήστε το πρόγραµµα:
/* matrix_pointers.c: Deixnei oti oi theseis mnimis enos pinaka einai
diadoxikes */
#include <stdio.h>
#define N 4
main()
{
int pin[N];
int i;
for (i=0; i<N; i++)
printf("nStoixeio:%d, Diefthinsi Thesis Mnimis: %d",i, &pin[i]);
}
Β. ∆είκτες και Πίνακες
3. Αριθµητική ∆εικτών
16∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Μεγάλη προσοχή. Οι δείκτες έχουν µια ιδιαίτερη αριθµητική έτσι ώστε να δουλεύουν αποδοτικά
σε συνδυασµό µε τους πίνακες:
Έστω το πρόγραµµα
Η εντολή:
∆εν αυξάνει την τιµή του δείκτη κατά 1!
Αλλά αυξάνει την τιµή του δείκτη κατά τόσα bytes όσα είναι και ο τύπος δεδοµένων του
δείκτη (για ακέραιο: κατά 4!).
Ενώ η εντολή:
Μειώνει την τιµή του δείκτη κατά τόσα bytes όσα είναι και ο τύπος δεδοµένων του δείκτη
(για ακέραιο: κατά 4!).
int pinakas[100];
int *ptr;
ptr=pinakas;
ptr--;
ptr++;
Β. ∆είκτες και Πίνακες
3. Αριθµητική ∆εικτών
17∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Το παρακάτω πρόγραµµα δείχνει πως µπορούµε να διατρέξουµε τα στοιχεία ενός πίνακα µέσω
ενός βοηθητικού δείκτη και όχι απ’ ευθείας!/* pointer_calc.c: Pws exoume prosvasi sta stoixeia enos pinaka mesw deikti */
#include <stdio.h>
#define N 10
main()
{
int pin[N];
int i;
int *ptr;
ptr=pin;
for (i=0; i<N; i++)
{
printf("nStoixeio:%d, Diefthinsi Thesis Mnimis: %d",i, ptr);
ptr++;
}
}
Β. ∆είκτες και Πίνακες
3. Αριθµητική ∆εικτών
18∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Για την ώρα µπορεί να µην φαίνεται χρήσιµο, γιατί να κάνουµε πρόσβαση στα στοιχεία του
πίνακα µε αυτόν τον τρόπο!
Αργότερα όµως θα δούµε πραγµατικά χρήσιµες εφαρµογές αυτής της ιδιότητας.
Ας δούµε όµως ένα ακόµη παράδειγµα:
Η εντολή ptr+=2 λοιπόν θα αυξήσει την τιµή της ptr κατα 2 x (το µέγεθος του double),
άρα θα αυξήσει τη διεύθυνση κατά 16, αφού µία double µεταβλητή δεσµεύει 8 bytes.
Μετά το πέρας της εκτέλεσης αυτών των εντολών ο δείκτης ptr θα δείχνει στο στοιχείο
pinakas[2].
double pinakas[100];
double *ptr;
ptr=pinakas;
ptr+=2;
Β. ∆είκτες και Πίνακες
4. Ισοδύναµος Συµβολισµός για την Πρόσβαση σε Πίνακα
19∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Με βάση την αριθµητική δεικτών, η παράσταση:
Μπορεί να εξηγηθεί ως εξής:
Το (array+2) δίνει την διεύθυνση του 3ου στοιχείου του πίνακα.
Άρα µε το * µπροστά, µας δίνει την τιµή του 3ου στοιχείου του πίνακα.
Έτσι για παράδειγµα ο βρόχος:
µπορεί να γραφεί ισοδύναµα:
*(array+2)
for (i=0; i<N; i++)
printf("%d",array[i]);
for (i=0; i<N; i++)
printf("%d",*(array+i));
Γ. ∆είκτες και Συναρτήσεις
1. ∆ιοχέτευση ∆είκτη σε Συνάρτηση
20∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Από τη στιγµή που ένας δείκτης µπορεί να ειδωθεί σαν µια µεταβλητή (στην οποία
αποθηκεύονται διευθύνσεις µεταβλητών), έχουµε κάθε δικαίωµα να τον περάσουµε ως όρισµα
σε µια συνάρτηση.
Π.χ. Το ακόλουθο πρωτότυπο συνάρτησης:
∆έχεται ως ορίσµατα δύο πράγµατα:
Έναν δείκτη σε ακέραιο (το p) και έναν ακέραιο (το x)
Μπορεί βεβαίως και από µία συνάρτηση να επιστραφεί ένας δείκτης σε µια µεταβλητή. Το
πρωτότυπο µιας τέτοιας συνάρτησης θα είναι:
Όπου στο σώµα της συνάρτησης θα ορίζουµε ότι επιστρέφεται ένας δείκτης σε ακέραια
µεταβλητή.
Μας ενδιαφέρει αυτό;
ΠΑΡΑ ΠΟΛΥ! Το πως περνάµε µια µεταβλητή (µέσω µεταβλητής ή µέσω δείκτη) είναι από
τις πιο σηµαντικές προγραµµατιστικές τεχνικές της C!
int func(int *p, int x)
int *func2(float y)
Γ. ∆είκτες και Συναρτήσεις
2. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Τιµής
21∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Στο µάθηµα 6 «Συναρτήσεις», είδαµε ότι κάθε συνάρτηση έχει τον δικό της χώρο
µεταβλητών στην µνήµη.
Ας µελετήσουµε για να θυµηθούµε τις ιδιότητες αυτές ένα απλό πρόγραµµα.
/*byvalue.c: Perasma orismatwn mesw timis */
#include <stdio.h>
void swap(int a,int b);
main()
{
int a=5,b=10;
printf("nMain: a=%d,b=%d",a,b);
swap(a,b);
printf("nMain: a=%d,b=%d",a,b);
}
void swap(int a, int b)
{
int k;
k=a;
a=b;
b=k;
printf("nSwap: a=%d,b=%d",a,b);
}
Γ. ∆είκτες και Συναρτήσεις
2. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Τιµής
22∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Ας θυµηθούµε πως δουλεύει το πρόγραµµα αυτό.
Πριν την κλήση της συνάρτησης swap, οι µεταβλητές a και b έχουν πάρει τις τιµές a=5 και
b=10.
Συνεπώς όταν γίνεται η κλήση της swap, τα ορίσµατα a, και b της συνάρτησης swap έχουν
αντίστοιχα τιµές 5 και 10.
Η εικόνα της µνήµης είναι:
Αφού εκτελεστούν οι εντολές της swap, αλλάζουν οι τιµές των a και b στην swap, αλλά
επειδή αυτές είναι τοπικές µεταβλητές στην swap η τιµή των a,b στην main δεν αλλάζει!
Η εικόνα της µνήµης είναι:
a b
…
Χώρος της main
5
Χώρος της swap
a b
510 10
a b
…
Χώρος της main
5
Χώρος της swap
a b
1010 5
Γ. ∆είκτες και Συναρτήσεις
2. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Τιµής
23∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Πρακτικά, όταν περνάµε ορίσµατα µέσω µεταβλητών, οι αλλαγές που γίνονται στις µεταβλητές
που διοχετεύουµε ως ορίσµατα, δεν θα εξακολουθούν να υφίστανται όταν ο έλεγχος του
προγράµµατος επιστρέψει στη καλούσα συνάρτηση.
Αυτός ο τρόπος για να περάσουµε ένα όρισµα σε µια συνάρτηση λέγεται διοχέτευση
ορίσµατος σε συνάρτηση µέσω τιµής (by value) υπό την έννοια ότι στην συνάρτηση
έχουµε στα χέρια µας την τιµή της µεταβλητής και όχι την ίδια την µεταβλητή.
Είναι προφανές ότι σε κάποιες συναρτήσεις θα επιθυµούµε να αλλάζει η τιµή της µεταβλητής
µέσα στην συνάρτηση και αυτό να µπορεί να το «δει» και η καλούσα συνάρτηση.
Αυτός είναι ο δεύτερος τρόπος για να περάσουµε ένα όρισµα σε µια συνάρτηση, λέγεται
διοχέτευση ορίσµατος σε συνάρτηση µέσω αναφοράς (by reference) και όπως θα δούµε
στην συνέχεια δεν διοχετεύουµε ως όρισµα την µεταβλητή, αλλά δείκτη στην µεταβλητή!
Γ. ∆είκτες και Συναρτήσεις
3. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Αναφοράς
24∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Άρα τροποποιούµε την συνάρτηση µας ως εξής:
/*byreference.c: Perasma orismatwn mesw anaforas */
#include <stdio.h>
void swap(int *ptrA, int *ptrB);
main()
{
int a=5,b=10;
printf("nMain: a=%d,b=%d",a,b);
swap(&a,&b);
printf("nMain: a=%d,b=%d",a,b);
}
void swap(int *ptrA, int *ptrB)
{
int k;
k=*ptrA;
*ptrA=*ptrB;
*ptrB=k;
printf("nSwap: a=%d,b=%d",*ptrA,*ptrB);
}
Γ. ∆είκτες και Συναρτήσεις
3. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Αναφοράς
25∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Να δούµε πως δουλεύει το πρόγραµµα αυτό.
Πριν την κλήση της συνάρτησης swap, οι µεταβλητές a και b έχουν πάρει τις τιµές a=5 και
b=10.
Ας υποθέσουµε ότι η διεύθυνση της a είναι 1000 και της b 1012.
Η τιµή &a, υπολογίζεται στο 1000, ενώ η τιµή &b υπολογίζεται στο 1012.
Συνεπώς όταν αρχίζει η εκτέλεση της swap η εικόνα της µνήµης είναι:
a b
…
Χώρος της main
5
Χώρος της swap
ptrA
10
a b
…
Χώρος της main
5
Χώρος της swap
100010
1000 1012
ptrB
1000 1012
ptrA ptrB
1012
Γ. ∆είκτες και Συναρτήσεις
3. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Αναφοράς
26∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Ας δούµε τώρα αναλυτικά τις εντολές που τρέχουν στην swap:
k=*ptrA; //Αναθέτει στην µεταβλητή k την τιµή της µεταβήτης που δείχνει ο ptrA
*ptrA=*ptrB; Αναθέτει στην µεταβλητή που δείχνει ο ptrA την τιµή που δείχνει ο ptrB
*ptrB=k; Αναθέτει στην µεταβλητή που δείχνει ο ptrB την τιµή του k
a b
…
Χώρος της main
5
Χώρος της swap
100010
1000 1012
ptrA ptrB
1012
k
5
a b
…
Χώρος της main
10
Χώρος της swap
100010
1000 1012
ptrA ptrB
1012
k
5
a b
…
Χώρος της main
10
Χώρος της swap
10005
1000 1012
ptrA ptrB
1012
k
5
Γ. ∆είκτες και Συναρτήσεις
3. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Αναφοράς
27∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Τι παρατηρούµε:
Ότι µε έµµεσο τρόπο η συνάρτηση προσπελαύνει τις ίδιες τις µεταβλητές της main!
Άρα για τον λόγο αυτό, οι αλλαγές που κάνουµε στις µεταβλητές παραµένουν και στην
main!
Συνοψίζοντας:
Αν θέλουµε να αλλάξει η τιµή µια µεταβλητής σε µια συνάρτηση και το αποτέλεσµα
αυτό να διατηρηθεί και στην καλούσα συνάρτηση, διοχετεύουµε το όρισµα µέσω
αναφοράς (δηλαδή µέσω δείκτη)
Αλλιώς διοχετεύουµε το όρισµα απλά µέσω τιµής.
Επιπλέον:
∆είτε ότι µε τον τρόπο αυτό µπορούµε να έχουµε περισσότερα από ένα
επιστρεφόµενα αποτελέσµατα.
Το ένα επιστρεφόµενο αποτέλεσµα θα το πάρουµε από την return και το άλλο µέσω
δείκτη!
Ή ακόµη πιο απλά µπορούµε να πάρουµε και τις δύο επιστρεφόµενες τιµές µέσω
δείκτη.
∆. Παρατηρήσεις
1. ∆ιοχέτευση Πίνακα ως Όρισµα σε Συνάρτηση
28∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Σηµείωση:
Επειδή είναι πολύ συνηθισµένο να διοχετεύουµε έναν πίνακα ως όρισµα, και για να είναι
πιο εµφανές στην ανάγνωση ότι πρόκειται περί πίνακα και όχι δείκτη σε µεταβλητή, η C
µας δίνει την δυνατότητα:
Αντί να γράψουµε το πρωτότυπο:
Να γράψουµε το πρωτότυπο:
Οποιοδήποτε από τα δύο πρωτότυπα και να χρησιµοποιήσουµε θα έχουµε το ίδιο
αποτέλεσµα.
void print(int *pinakas, int n);
void print(int pinakas[], int n);
Με βάση τα παραπάνω εξ’ ορισµού το πέρασµα ενός πίνακα σε µία συνάρτηση γίνεται
µέσω αναφοράς.
Άρα θα θυµόµαστε ότι οποιαδήποτε αλλαγή γίνεται σε έναν πίνακα που διοχετεύουµε ως
όρισµα, παραµένει και στην καλούσα συνάρτηση.
Αν θέλουµε να περάσουµε αντίγραφο του πίνακα ως όρισµα σε µία συνάρτηση, θα πρέπει
να κατασκευάσουµε πρώτα ένα αντίγραφό του.
∆. Παρατηρήσεις
2. Η Σταθερά NULL
29∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Ένα πολύ συνηθισµένο λάθος είναι να καταχωρούµε τιµή σε έναν δείκτη που δεν τον έχουµε
συσχετίσει µε µια µεταβλητή. Π.χ. ο κώδικας:
Θα δηµιουργήσει σφάλµα εκτέλεσης! Το p δεν δείχνει πουθενά, άρα όταν πάµε να
εκτελέσουµε την εντολή δεν επηρεάζουµε κάποια µεταβλητή, άρα το πρόγραµµα έχει µια
απροσδόκητη συµπεριφορά!
Συνεπώς πάντα όταν δηλώνουµε ένα δείκτη, θα πρέπει να τον συσχετίζουµε µε µια µεταβλητή η
οποία θα είναι αποθηκευµένη στην µνήµη.
Θα υπάρξουν και κάποιες περιπτώσεις που θα θέλουµε ο δείκτης να µην έχει τιµή. Για τον λόγο
αυτό στην C είναι ορισµένη µία συµβολική σταθερά, το NULL, την οποία θα την
χρησιµοποιούµε συµβολικά για να λέµε ότι «ο δείκτης δεν δείχνει πουθενά». Παράδειγµα:
int x;
int *p;
*p=15;
int *p;
p=NULL; /* O p δεν δείχνει πουθενά */
Ε. Ασκήσεις
1. Υπολογισµός Ριζών Β’Βάθµιας Εξίσωσης
30∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
1. Γράψτε µια συνάρτηση µε όνοµα:
• Η οποία να υπολογίζει τις ρίζες της εξίσωσης ax2+bx+c=0. Η συνάρτηση να επιστρέφει
(µέσω ορίσµατος) στις µεταβλητές x1 και x2 τις πραγµατικές ρίζες της εξίσωσης και να
επιστρέφει µε return το πλήθος των λύσεων της εξίσωσης
• Βοήθεια: Θα χρειαστείτε την συνάρτηση:
• Η οποία είναι ορισµένη στο αρχείο κεφαλίδας math.h
• Βοήθεια: Ο προσδιοριστής των printf, scanf για τύπο δεδοµένων float είναι %f (αντί
για %d στους ακεραίους)
2. Έπειτα γράψτε µια συνάρτηση main, που θα διαβάζει από την είσοδο τις τιµές των a,b,c
(συντελεστές της εξίσωσης) και αφού εκτελέσει την συνάρτηση rizes θα εκτυπώνει τα
κατάλληλα µηνύµατα µε τις ρίζες της β’ βάθµιας εξίσωης.
int rizes(float a, float b, float c, float *x1, float *x2);
double sqrt(double x);
Ε. Ασκήσεις
2. Συνάρτηση init_array
31∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
1. Γράψτε την συνάρτηση: void init_array(int *pinakas, int n, int a, int b)
που να αρχικοποιεί έναν πίνακα n ακεραίων, µε τυχαίους αριθµούς στο διάστηµα [a..b]
2. Ελέγξτε την ορθότητα της συνάρτησής σας µε κατάλληλα παραδείγµατα
Ε. Ασκήσεις
3. Συνάρτηση print_array
32∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Επεκτείνετε το πρόγραµµα της προηγούµενης άσκησης:
1. Γράψτε την συνάρτηση: void print_array(int *pinakas, int n) που να τυπώνει
τα περιεχόµενα του πίνακα ακεραίων pinakas.
2. Ελέγξτε την ορθότητα της συνάρτησής σας µε κατάλληλα παραδείγµατα
Ε. Ασκήσεις
4. Συνάρτηση max_array
33∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Επεκτείνετε το πρόγραµµα της προηγούµενης άσκησης:
1. Γράψτε την συνάρτηση: int max_array(int *pinakas, int n) που να επιστρέφει
τον µέγιστο στοιχείο του πίνακα ακεραίων pinakas
2. Ελέγξτε την ορθότητα της συνάρτησής σας µε κατάλληλα παραδείγµατα
Ε. Ασκήσεις
5. Ένα Πολύπλοκο Πρόγραµµα
34∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
Συνεχίζοντας το προηγούµενο παράδειγµα, γράψτε µία συνάρτηση main η οποία:
1. Να δηλώνει έναν πίνακα ακεραίων 1000 θέσεων
2. Μέσα από ένα επαναλαµβανόµενο βρόχο να δίνει 6 επιλογές στον χρήστη:
1. Να εισάγει το µέγεθος του πίνακα
2. Να αρχικοποιεί µε τυχαίους αριθµούς από το a έως το b τα στοιχεία του πίνακα,
όπου a και b είναι αριθµοί που ζητούνται από το χρήστη.
3. Να βρίσκει τον µέγιστο του πίνακα και να τον τυπώνει
4. Να τυπώνει όλα τα στοιχεία του πίνακα
5. Να κάνει έξοδο από τον επαναλαµβανόµενο βρόχο

Contenu connexe

Tendances

ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18 ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
Dimitris Psounis
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝ
Dimitris Psounis
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 16 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΞΟΔΟΥ (ΕΚΤΥΠΩΣΗ)
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 16 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΞΟΔΟΥ (ΕΚΤΥΠΩΣΗ)Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 16 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΞΟΔΟΥ (ΕΚΤΥΠΩΣΗ)
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 16 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΞΟΔΟΥ (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8
Dimitris Psounis
 
ΠΛΗ10 ΜΑΘΗΜΑ 2.6
ΠΛΗ10 ΜΑΘΗΜΑ 2.6 ΠΛΗ10 ΜΑΘΗΜΑ 2.6
ΠΛΗ10 ΜΑΘΗΜΑ 2.6
Dimitris Psounis
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2
Dimitris Psounis
 
ΠΛΗ10 ΜΑΘΗΜΑ 2.5
ΠΛΗ10 ΜΑΘΗΜΑ 2.5ΠΛΗ10 ΜΑΘΗΜΑ 2.5
ΠΛΗ10 ΜΑΘΗΜΑ 2.5
Dimitris Psounis
 

Tendances (20)

Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12
 
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑ
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑ
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑ
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18 ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝ
 
Η Γλώσσα C - Μάθημα 2
Η Γλώσσα C - Μάθημα 2Η Γλώσσα C - Μάθημα 2
Η Γλώσσα C - Μάθημα 2
 
Η Γλώσσα C - Μάθημα 1
Η Γλώσσα C - Μάθημα 1Η Γλώσσα C - Μάθημα 1
Η Γλώσσα C - Μάθημα 1
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9 ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 16 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΞΟΔΟΥ (ΕΚΤΥΠΩΣΗ)
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 16 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΞΟΔΟΥ (ΕΚΤΥΠΩΣΗ)Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 16 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΞΟΔΟΥ (ΕΚΤΥΠΩΣΗ)
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 16 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΞΟΔΟΥ (ΕΚΤΥΠΩΣΗ)
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8
 
ΠΛΗ10 ΜΑΘΗΜΑ 2.4
ΠΛΗ10 ΜΑΘΗΜΑ 2.4ΠΛΗ10 ΜΑΘΗΜΑ 2.4
ΠΛΗ10 ΜΑΘΗΜΑ 2.4
 
ΠΛΗ10 ΜΑΘΗΜΑ 2.7
ΠΛΗ10 ΜΑΘΗΜΑ 2.7 ΠΛΗ10 ΜΑΘΗΜΑ 2.7
ΠΛΗ10 ΜΑΘΗΜΑ 2.7
 
ΠΛΗ10 ΜΑΘΗΜΑ 2.3: ΤΕΛΕΣΤΕΣ ΚΑΙ Η ΕΝΤΟΛΗ ΑΠΟΦΑΣΗΣ
ΠΛΗ10 ΜΑΘΗΜΑ 2.3: ΤΕΛΕΣΤΕΣ ΚΑΙ Η ΕΝΤΟΛΗ ΑΠΟΦΑΣΗΣΠΛΗ10 ΜΑΘΗΜΑ 2.3: ΤΕΛΕΣΤΕΣ ΚΑΙ Η ΕΝΤΟΛΗ ΑΠΟΦΑΣΗΣ
ΠΛΗ10 ΜΑΘΗΜΑ 2.3: ΤΕΛΕΣΤΕΣ ΚΑΙ Η ΕΝΤΟΛΗ ΑΠΟΦΑΣΗΣ
 
ΠΛΗ10 ΜΑΘΗΜΑ 2.6
ΠΛΗ10 ΜΑΘΗΜΑ 2.6 ΠΛΗ10 ΜΑΘΗΜΑ 2.6
ΠΛΗ10 ΜΑΘΗΜΑ 2.6
 
ΠΛΗ10 ΤΕΣΤ 2
ΠΛΗ10 ΤΕΣΤ 2ΠΛΗ10 ΤΕΣΤ 2
ΠΛΗ10 ΤΕΣΤ 2
 
ΠΛΗ10 ΜΑΘΗΜΑ 1.4
ΠΛΗ10 ΜΑΘΗΜΑ 1.4ΠΛΗ10 ΜΑΘΗΜΑ 1.4
ΠΛΗ10 ΜΑΘΗΜΑ 1.4
 
ΠΛΗ10 ΜΑΘΗΜΑ 2.1
ΠΛΗ10 ΜΑΘΗΜΑ 2.1 ΠΛΗ10 ΜΑΘΗΜΑ 2.1
ΠΛΗ10 ΜΑΘΗΜΑ 2.1
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2
 
ΠΛΗ10 ΜΑΘΗΜΑ 2.5
ΠΛΗ10 ΜΑΘΗΜΑ 2.5ΠΛΗ10 ΜΑΘΗΜΑ 2.5
ΠΛΗ10 ΜΑΘΗΜΑ 2.5
 

Similaire à Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ

ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 4
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 4ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 4
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 4
Dimitris Psounis
 
ΑΕΠΠ: 3ο Επαναληπτικό Τεστ
ΑΕΠΠ: 3ο Επαναληπτικό ΤεστΑΕΠΠ: 3ο Επαναληπτικό Τεστ
ΑΕΠΠ: 3ο Επαναληπτικό Τεστ
Nikos Michailidis
 
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 3
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 3ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 3
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 3
Dimitris Psounis
 
ΑΕΠΠ: 19ο Φύλλο Ασκήσεων
ΑΕΠΠ: 19ο Φύλλο ΑσκήσεωνΑΕΠΠ: 19ο Φύλλο Ασκήσεων
ΑΕΠΠ: 19ο Φύλλο Ασκήσεων
Nikos Michailidis
 

Similaire à Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ (20)

ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ
 
Python - Bασικές Aρχές Προγραμματισμού - Κεφ. 3
Python - Bασικές Aρχές Προγραμματισμού - Κεφ. 3Python - Bασικές Aρχές Προγραμματισμού - Κεφ. 3
Python - Bασικές Aρχές Προγραμματισμού - Κεφ. 3
 
Advanced Notes on Pointers
Advanced Notes on PointersAdvanced Notes on Pointers
Advanced Notes on Pointers
 
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣΗ ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ
 
ΠΛΗ10 ΤΕΣΤ 32
ΠΛΗ10 ΤΕΣΤ 32ΠΛΗ10 ΤΕΣΤ 32
ΠΛΗ10 ΤΕΣΤ 32
 
Plir b
Plir bPlir b
Plir b
 
Stelios poulakakis daktylidis diploma thesis presentation
Stelios poulakakis daktylidis diploma thesis presentationStelios poulakakis daktylidis diploma thesis presentation
Stelios poulakakis daktylidis diploma thesis presentation
 
ΠΛΗ10 ΤΕΣΤ 35
ΠΛΗ10 ΤΕΣΤ 35ΠΛΗ10 ΤΕΣΤ 35
ΠΛΗ10 ΤΕΣΤ 35
 
ΠΛΗ10 ΤΕΣΤ 34
ΠΛΗ10 ΤΕΣΤ 34ΠΛΗ10 ΤΕΣΤ 34
ΠΛΗ10 ΤΕΣΤ 34
 
Python Programming, 1st Test 2016-17
Python Programming, 1st Test 2016-17Python Programming, 1st Test 2016-17
Python Programming, 1st Test 2016-17
 
αναπαράσταση αλγορίθμων και δεδομένων
αναπαράσταση αλγορίθμων και δεδομένωναναπαράσταση αλγορίθμων και δεδομένων
αναπαράσταση αλγορίθμων και δεδομένων
 
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 4
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 4ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 4
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 4
 
Python Κεφ. 1.5 συναρτήσεις
Python Κεφ. 1.5 συναρτήσειςPython Κεφ. 1.5 συναρτήσεις
Python Κεφ. 1.5 συναρτήσεις
 
ΑΕΠΠ: 3ο Επαναληπτικό Τεστ
ΑΕΠΠ: 3ο Επαναληπτικό ΤεστΑΕΠΠ: 3ο Επαναληπτικό Τεστ
ΑΕΠΠ: 3ο Επαναληπτικό Τεστ
 
Θέματα Πανελλαδικών Εξετάσεων 2014 - Ημερησίων ΕΠΑΛ – Ομάδα Α - Δομημένος Προ...
Θέματα Πανελλαδικών Εξετάσεων 2014 - Ημερησίων ΕΠΑΛ – Ομάδα Α - Δομημένος Προ...Θέματα Πανελλαδικών Εξετάσεων 2014 - Ημερησίων ΕΠΑΛ – Ομάδα Α - Δομημένος Προ...
Θέματα Πανελλαδικών Εξετάσεων 2014 - Ημερησίων ΕΠΑΛ – Ομάδα Α - Δομημένος Προ...
 
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 3
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 3ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 3
ΠΛΗ30 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 3
 
Python. 1 2 δομή ακολουθίας
Python. 1 2 δομή ακολουθίαςPython. 1 2 δομή ακολουθίας
Python. 1 2 δομή ακολουθίας
 
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ CC++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C
 
ΑΕΠΠ: 19ο Φύλλο Ασκήσεων
ΑΕΠΠ: 19ο Φύλλο ΑσκήσεωνΑΕΠΠ: 19ο Φύλλο Ασκήσεων
ΑΕΠΠ: 19ο Φύλλο Ασκήσεων
 
Python Κεφ. 1.4 Δομή Επανάληψης
Python Κεφ. 1.4 Δομή ΕπανάληψηςPython Κεφ. 1.4 Δομή Επανάληψης
Python Κεφ. 1.4 Δομή Επανάληψης
 

Plus de Dimitris Psounis

ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6
Dimitris Psounis
 
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5
Dimitris Psounis
 
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis
 
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2
Dimitris Psounis
 
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis
 
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1
Dimitris Psounis
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7
Dimitris Psounis
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6
Dimitris Psounis
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis
 

Plus de Dimitris Psounis (20)

Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ)
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ)Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ)
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ)
 
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ)
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ)ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ)
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ)
 
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣΗ ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
 
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ)
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ)Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ)
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ)
 
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p)
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p)C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p)
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p)
 
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6
 
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5
 
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)
 
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2
 
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)
 
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)
 
ΠΛΗ31 - ΤΕΣΤ 33
ΠΛΗ31 - ΤΕΣΤ 33ΠΛΗ31 - ΤΕΣΤ 33
ΠΛΗ31 - ΤΕΣΤ 33
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6
 
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)
 
ΠΛΗ31 ΤΕΣΤ 32
ΠΛΗ31 ΤΕΣΤ 32ΠΛΗ31 ΤΕΣΤ 32
ΠΛΗ31 ΤΕΣΤ 32
 
ΠΛΗ31 ΤΕΣΤ 31
ΠΛΗ31 ΤΕΣΤ 31ΠΛΗ31 ΤΕΣΤ 31
ΠΛΗ31 ΤΕΣΤ 31
 
ΠΛΗ31 ΤΕΣΤ 30
ΠΛΗ31 ΤΕΣΤ 30ΠΛΗ31 ΤΕΣΤ 30
ΠΛΗ31 ΤΕΣΤ 30
 

Dernier

5ο Κεφάλαιο - Το Λογισμικό του Υπολογιστή.pptx
5ο Κεφάλαιο - Το Λογισμικό του Υπολογιστή.pptx5ο Κεφάλαιο - Το Λογισμικό του Υπολογιστή.pptx
5ο Κεφάλαιο - Το Λογισμικό του Υπολογιστή.pptx
Athina Tziaki
 
9.SPSS και δείκτες περιγραφικής στατιστικής.pdf
9.SPSS και δείκτες περιγραφικής στατιστικής.pdf9.SPSS και δείκτες περιγραφικής στατιστικής.pdf
9.SPSS και δείκτες περιγραφικής στατιστικής.pdf
ssuser2f8893
 

Dernier (14)

5ο Κεφάλαιο - Το Λογισμικό του Υπολογιστή.pptx
5ο Κεφάλαιο - Το Λογισμικό του Υπολογιστή.pptx5ο Κεφάλαιο - Το Λογισμικό του Υπολογιστή.pptx
5ο Κεφάλαιο - Το Λογισμικό του Υπολογιστή.pptx
 
ΙΣΤΟΡΙΑ Α΄ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΨΗ 2024
ΙΣΤΟΡΙΑ Α΄ΓΥΜΝΑΣΙΟΥ  : ΕΠΑΝΑΛΗΨΗ 2024ΙΣΤΟΡΙΑ Α΄ΓΥΜΝΑΣΙΟΥ  : ΕΠΑΝΑΛΗΨΗ 2024
ΙΣΤΟΡΙΑ Α΄ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΨΗ 2024
 
Επίσκεψη στο 11ο Γυμνάσιο Πάτρας
Επίσκεψη              στο 11ο Γυμνάσιο ΠάτραςΕπίσκεψη              στο 11ο Γυμνάσιο Πάτρας
Επίσκεψη στο 11ο Γυμνάσιο Πάτρας
 
Επίσκεψη στο 10ο Γυμνάσιο Πάτρας
Επίσκεψη          στο 10ο Γυμνάσιο ΠάτραςΕπίσκεψη          στο 10ο Γυμνάσιο Πάτρας
Επίσκεψη στο 10ο Γυμνάσιο Πάτρας
 
9.SPSS και δείκτες περιγραφικής στατιστικής.pdf
9.SPSS και δείκτες περιγραφικής στατιστικής.pdf9.SPSS και δείκτες περιγραφικής στατιστικής.pdf
9.SPSS και δείκτες περιγραφικής στατιστικής.pdf
 
Επίσκεψη στο 12ο Γυμνάσιο Πάτρας
Επίσκεψη          στο 12ο Γυμνάσιο ΠάτραςΕπίσκεψη          στο 12ο Γυμνάσιο Πάτρας
Επίσκεψη στο 12ο Γυμνάσιο Πάτρας
 
-Διψήφιοι αριθμοί-δεκαδες μονάδες-θέση ψηφίου Α- Β τάξη
-Διψήφιοι  αριθμοί-δεκαδες μονάδες-θέση ψηφίου Α- Β τάξη-Διψήφιοι  αριθμοί-δεκαδες μονάδες-θέση ψηφίου Α- Β τάξη
-Διψήφιοι αριθμοί-δεκαδες μονάδες-θέση ψηφίου Α- Β τάξη
 
Μαθητικές καταλήψεις
Μαθητικές                                  καταλήψειςΜαθητικές                                  καταλήψεις
Μαθητικές καταλήψεις
 
ΙΣΤΟΡΙΑ Α' ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ ΜΕΡΟΣ 2ο
ΙΣΤΟΡΙΑ Α' ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ ΜΕΡΟΣ 2οΙΣΤΟΡΙΑ Α' ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ ΜΕΡΟΣ 2ο
ΙΣΤΟΡΙΑ Α' ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ ΜΕΡΟΣ 2ο
 
Σουρεαλιστικά ταξίδια μέσα από την τέχνη
Σουρεαλιστικά ταξίδια μέσα από την τέχνηΣουρεαλιστικά ταξίδια μέσα από την τέχνη
Σουρεαλιστικά ταξίδια μέσα από την τέχνη
 
ΙΣΤΟΡΙΑ Α' ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ ΜΕΡΟΣ 1ο
ΙΣΤΟΡΙΑ Α' ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ  ΜΕΡΟΣ 1ο ΙΣΤΟΡΙΑ Α' ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ  ΜΕΡΟΣ 1ο
ΙΣΤΟΡΙΑ Α' ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΑΣΚΗΣΕΙΣ ΜΕΡΟΣ 1ο
 
Σεβασμός .
Σεβασμός                                   .Σεβασμός                                   .
Σεβασμός .
 
Μαθητικά συμβούλια .
Μαθητικά συμβούλια                                  .Μαθητικά συμβούλια                                  .
Μαθητικά συμβούλια .
 
ΙΣΤΟΡΙΑ Γ΄ ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΨΗ 2024
ΙΣΤΟΡΙΑ Γ΄ ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΨΗ 2024ΙΣΤΟΡΙΑ Γ΄ ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΨΗ 2024
ΙΣΤΟΡΙΑ Γ΄ ΓΥΜΝΑΣΙΟΥ : ΕΠΑΝΑΛΗΨΗ 2024
 

Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ

  • 1. H ΓΛΩΣΣΑ C Μάθηµα 8: ∆είκτες ∆ηµήτρης Ψούνης
  • 2. Περιεχόµενα Μαθήµατος Α. ∆είκτες 1. Η µνήµη του υπολογιστή 2. Η έννοια του δείκτη 3. Ορισµός ∆είκτη 4. Απόδοση τιµής σε δείκτη (Ο τελεστής &) 5. Απόδοση τιµής µέσω δείκτη (ο τελεστής *) 6. Παράδειγµα χρήσης δείκτη Β. ∆είκτες και Πίνακες 1. Το όνοµα ενός πίνακα είναι δείκτης 2. Αποθήκευση ενός πίνακα στη µνήµη 3. Αριθµητική ∆εικτών 4. Ισοδύναµος Συµβολισµός για πρόσβασή σε πίνακα Γ. ∆είκτες και Συναρτήσεις 1. ∆ιοχέτευση ∆είκτη σε Συνάρτηση 2. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση µέσω Τιµής 3. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση µέσω Αναφοράς ∆. Παρατηρήσεις 1. ∆ιοχέτευση πίνακα ως όρισµα σε συνάρτηση 2. Η Σταθερά NULL Ασκήσεις 2∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες
  • 3. A. ∆είκτες 1. Η Μνήµη του Υπολογιστή 3∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Έχουµε ήδη δει κάποιες πληροφορίες για την οργάνωση της µνήµης σε ένα πρόγραµµα. Σε µια απλουστευµένη (αλλά επαρκή) προσέγγιση µπορούµε να φανταστούµε την µνήµη σαν µια ταινία µε χώρους αποθήκευσης δεδοµένων. Κάθε χώρος αποθήκευσης είναι 1 byte (δηλαδή 8 bits). Προκειµένου να µπορούµε να εντοπίσουµε κάθε χώρο αποθήκευσης, έχει έναν αναγνωριστικό αύξων αριθµό (που λέγεται διεύθυνση µνήµης). Έτσι η εικόνα που πρέπει να έχουµε για την µνήµη θα είναι κελιά, το κάθε ένα µε έναν αναγνωριστικό αριθµό, το οποίο θα έχει µέγεθος 1 byte: 1Byte 0 … 1 2 1000 1001 … 10000 10001 … 2x109 1Byte 1Byte 1Byte 1Byte 1Byte 1Byte 1Byte
  • 4. A. ∆είκτες 1. Η Μνήµη του Υπολογιστή 4∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Είδαµε ότι µια συνάρτηση έχει τον δικό της χώρο αποθήκευσης µεταβλητών. Όταν πρόκειται να εκτελεστεί µια συνάρτηση, δεσµεύεται ο χώρος της µνήµης για τις µεταβλητές της συνάρτησης. Έτσι αν για παράδειγµα η main καλεί µια συνάρτηση που έχουµε γράψει (έστω µε όνοµα f), τότε ο µεταγλωττιστής θα µεριµνήσει ώστε κάθε συνάρτηση να έχει τον χώρο της στην µνήµη. Ο χώρος που δεσµεύεται είναι αρκετά µεγάλος για να χωρέσει πάρα πολλές µεταβλητές (το ακριβές πλήθος καθορίζεται από το λειτουργικό σύστηµα, το µεταγλωττιστή κ.λπ.) … 1000 1001 … 15448 15449 … 1002 Χώρος της f Χώρος της main …… …
  • 5. A. ∆είκτες 1. Η Μνήµη του Υπολογιστή 5∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Όταν δηλώνουµε µεταβλητές σε µια συνάρτηση, ο µεταγλωττιστής επιλέγει κάποιον από τον ελεύθερο χώρο της συνάρτησης για να αποθηκεύσει την µεταβλητή. Έτσι αν π.χ. η f δηλώνει στον χώρο δήλωσης µεταβλητών της δύο ακέραιες µεταβλητές, έστω την x και την y (θεωρούµε ότι µια ακέραια µεταβλητή δεσµεύει 4 bytes όπως συζητήσαµε σε προηγούµενο µάθηµα) Τότε η εικόνα της µνήµης θα είναι η εξής … 1014 1015 … Χώρος της f Χώρος της main … … 1016 1017 1057 1058 1059 1060 … x y … ……
  • 6. A. ∆είκτες 1. Η Μνήµη του Υπολογιστή 6∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Έτσι αν γράψουµε x=1 και y=5 µε εντολές καταχώρησης στο σώµα της f, τότε αποθηκεύονται στις µεταβλητές οι αντίστοιχες τιµές. Ο τρόπος αποθήκευσης στο δυαδικό σύστηµα των αριθµών αυτών δεν µας ενδιαφέρει όταν γράφουµε το πρόγραµµά µας. Συνοψίζοντας αντιλαµβανόµαστε ότι µία µεταβλητή µπορεί να εντοπιστεί πλήρως από δύο δεδοµένα: τον τύπο δεδοµένων της (για να ξέρουµε πόσα bytes δεσµεύει στην µνήµη) και το πρώτο byte στο οποίο είναι αποθηκευµένη. Π.χ. Για την x αν ξέρω ότι είναι ακέραια και το 1ο byte της είναι το 1014, τότε µπορώ να εξάγω ότι θα είναι αποθηκευµένη στα bytes 1014-1017. … 1014 1015 … Χώρος της f Χώρος της main … … 1016 1017 1057 1058 1059 1060 … x y … …… 1 5
  • 7. A. ∆είκτες 2. Η Έννοια του ∆είκτη 7∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Έτσι λοιπόν, η εικόνα που θα πρέπει να έχουµε στο µυαλό µας, είναι ότι κάθε µεταβλητή έχει έναν χώρο αποθήκευσης (ίσου µε το µέγεθος της µεταβλητής σε bytes) µε αναγνωριστικό τη διεύθυνση µνήµης του 1ου byte που αυτή δεσµεύει. Από την στιγµή όµως που η διεύθυνση µνήµης είναι ένας αριθµός, µπορεί να αντιµετωπιστεί σαν οποιοσδήποτε άλλος αριθµός στην C. Άρα για παράδειγµα µπορούµε να δηλώσουµε µια µεταβλητή στην οποία να αποθηκεύουµε την διεύθυνση µνήµης µιας άλλης µεταβλητής! … 1014 … Χώρος της f Χώρος της main … … 1057 … x y … …… 1 5
  • 8. A. ∆είκτες 2. Η Έννοια του ∆είκτη 8∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Συνεπώς µπορούµε να δηλώσουµε µια µεταβλητή (έστω µε όνοµα ptr) που θα αποθηκεύσουµε π.χ. την διεύθυνση της µεταβλητής x. Αυτή η µεταβλητή, η οποία αποθηκεύει ως τιµή την διεύθυνση µνήµης άλλων µεταβλητών ονοµάζεται δείκτης: ∆είτε λοιπόν ότι ο δείκτης ptr έχει ως τιµή την διεύθυνση της µεταβλητής x. Θα λέµε για το λόγο αυτό, ότι ο δείκτης ptr δείχνει στην µεταβλητή x … 1014 … Χώρος της f Χώρος της main … … 1057 … Μεταβλητή x ∆είκτης ptr … …… 1 1014
  • 9. A. ∆είκτες 3. Ορισµός ∆είκτη 9∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Ένας δείκτης δηλώνεται µε την εντολή δήλωσης: ∆ηλώνουµε έναν δείκτη µε όνοµα «Ονοµα_∆είκτη» που θα δείχνει σε µια µεταβλητή τύπου δεδοµένων «Τύπος_∆εδοµένων» Παραδείγµατα: Εδώ δηλώνουµε έναν δείκτη σε ακέραιο µε όνοµα p. Εδώ δηλώνουµε έναν δείκτη σε double µε όνοµα ptr ∆ιαπιστώστε ότι ένας δείκτης είναι ακόµη ένας τύπος δεδοµένων. Με την ιδιαιτερότητα ότι οι µεταβλητές που θα αποθηκεύει θα είναι διευθύνσεις µνήµης. Ο τύπος δεδοµένων συµβολικά είναι (int *) και (double *) αντίστοιχα στις δηλώσεις που είδαµε. Τύπος_∆εδοµένων *Ονοµα_∆είκτη int *p; double *ptr;
  • 10. A. ∆είκτες 4. Απόδοση Τιµής σε ∆είκτη 10∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Για να έχει νόηµα ένας δείκτης πρέπει να τον συσχετίσουµε µε µια µεταβλητή, ή όπως λέµε να τον βάλουµε να δείχνει στην µεταβλητή. Αυτό γίνεται µε τον εξής τρόπο: Ο τελεστής & (θα τον διαβάζουµε «διεύθυνση του») µπαίνει µπροστά από µια µεταβλητή και µας επιστρέφει την διεύθυνση του. Άρα: αν η x είναι αποθηκευµένη π.χ. στην διεύθυνση 10333, τότε η τιµή &x (διεύθυνση του x) είναι 10333, άρα η τιµή της p µετά την εντολή ανάθεσης είναι 10333. int x; int *p; p=&x; // Βάλε τον δείκτη p να δείχνει στην x.
  • 11. A. ∆είκτες 5. Απόδοση Τιµής µέσω ∆είκτη (Ο τελεστής *) 11∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Ο τελεστής * (που ονοµάζεται τελεστής έµµεσης διευθυνσιοδότησης) έχει δύο χρήσεις: Είδαµε την πρώτη που είναι να δηλώσουµε µια µεταβλητή τύπου δείκτη. Η δεύτερη χρήση είναι η εξής: Αν σε µία εντολή, βάλουµε το * µπροστά από έναν δείκτη, τότε αναφερόµαστε στην µεταβλητή που δείχνει ο δείκτης. Βλέπουµε το παράδειγµα: Μετά από αυτό το παράδειγµα αντιλαµβανόµαστε ότι έχουµε δύο τρόπους για να έχουµε πρόσβαση στην µεταβλητή x: Απευθείας µε το όνοµα της x (άµεση πρόσβαση) Μέσω του δείκτη που δείχνει στην x (έµµεση πρόσβαση) int x; int *p; p=&x; *p=5; //Η µεταβλητή που δείχνει το *p (άρα το x) παίρνει την τιµή 5
  • 12. A. ∆είκτες 6. Παράδειγµα Χρήσης ∆εικτών 12∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Μεταγλωττίστε, εκτελέστε και µελετήστε το πρόγραµµα: /* pointers.c: Deixnei tin vasiki xrisi twn deiktwn */ #include <stdio.h> main() { int x; int *ptr; ptr=&x; x=5; printf("x=%dt *ptr=%dt &x=%dt ptr=%d",x,*ptr,&x,ptr); *ptr=8; printf("nx=%dt *ptr=%dt &x=%dt ptr=%d",x,*ptr,&x,ptr); x=9; printf("nx=%dt *ptr=%dt &x=%dt ptr=%d",x,*ptr,&x,ptr); }
  • 13. Β. ∆είκτες και Πίνακες 1. Το Όνοµα ενός Πίνακα είναι ∆είκτης 13∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Οι δείκτες είναι πολύ χρήσιµοι σε συνδυασµό µε τους πίνακες! Αυτό συµβαίνει διότι εξ’ ορισµού το όνοµα κάθε πίνακα είναι ένας δείκτης µε τύπο δεδοµένων τον τύπο δεδοµένων του πίνακα. Ωστόσο είναι ένας δείκτης που δεν µπορούµε να αλλάξουµε την τιµή του. Μπορούµε όµως να ορίσουµε έναν δείκτη να δείχνει στην αρχή του πίνακα µε τον εξής τρόπο: Ο δείκτης θα δείχνει στον πρώτο ακέραιο αριθµό του πίνακα. Ο δείκτης ptr µπορεί να αλλάξει! Σηµειώστε εδώ ότι θα µπορούσαµε να βάλουµε τον δείκτη να δείχνει στο πρώτο στοιχείο του πίνακα και µε την εντολή Ωστόσο είναι σηµαντικό να γνωρίζουµε τον πρώτο τρόπο. ptr=&pinakas[0] int pinakas[100]; int *ptr; ptr=pinakas; int pinakas[100]; int *ptr; ptr=&pinakas[0];
  • 14. Β. ∆είκτες και Πίνακες 2. Αποθήκευση ενός Πίνακα στη Μνήµη 14∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Στο µάθηµα 8, είδαµε ότι τα στοιχεία ενός πίνακα αποθηκεύονται σε διαδοχικές θέσεις µνήµης. Έφτασε η ώρα να το διαπιστώσουµε και πειραµατικά. Είδαµε ότι µε την δήλωση: ∆ηµιουργείται ένας πίνακας 4 διαδοχικών θέσεων στην µνήµη Γνωρίζουµε πλέον ότι &pin[0],&pin[1],&pin[2],&pin[3] είναι οι διευθύνσεις µνήµης των 4 µεταβλητών του πίνακα. Το πρόγραµµα της επόµενης διαφάνειας δείχνει ότι όντως οι µεταβλητές αυτές αποθηκεύονται σε διαδοχικές θέσεις µνήµης. int pin[4]; Χώρος της συνάρτησης pin[0] pin[1] pin[2] … pin[3] …
  • 15. Β. ∆είκτες και Πίνακες 2. Αποθήκευση ενός Πίνακα στη Μνήµη 15∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Μεταγλωττίστε, εκτελέστε και µελετήστε το πρόγραµµα: /* matrix_pointers.c: Deixnei oti oi theseis mnimis enos pinaka einai diadoxikes */ #include <stdio.h> #define N 4 main() { int pin[N]; int i; for (i=0; i<N; i++) printf("nStoixeio:%d, Diefthinsi Thesis Mnimis: %d",i, &pin[i]); }
  • 16. Β. ∆είκτες και Πίνακες 3. Αριθµητική ∆εικτών 16∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Μεγάλη προσοχή. Οι δείκτες έχουν µια ιδιαίτερη αριθµητική έτσι ώστε να δουλεύουν αποδοτικά σε συνδυασµό µε τους πίνακες: Έστω το πρόγραµµα Η εντολή: ∆εν αυξάνει την τιµή του δείκτη κατά 1! Αλλά αυξάνει την τιµή του δείκτη κατά τόσα bytes όσα είναι και ο τύπος δεδοµένων του δείκτη (για ακέραιο: κατά 4!). Ενώ η εντολή: Μειώνει την τιµή του δείκτη κατά τόσα bytes όσα είναι και ο τύπος δεδοµένων του δείκτη (για ακέραιο: κατά 4!). int pinakas[100]; int *ptr; ptr=pinakas; ptr--; ptr++;
  • 17. Β. ∆είκτες και Πίνακες 3. Αριθµητική ∆εικτών 17∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Το παρακάτω πρόγραµµα δείχνει πως µπορούµε να διατρέξουµε τα στοιχεία ενός πίνακα µέσω ενός βοηθητικού δείκτη και όχι απ’ ευθείας!/* pointer_calc.c: Pws exoume prosvasi sta stoixeia enos pinaka mesw deikti */ #include <stdio.h> #define N 10 main() { int pin[N]; int i; int *ptr; ptr=pin; for (i=0; i<N; i++) { printf("nStoixeio:%d, Diefthinsi Thesis Mnimis: %d",i, ptr); ptr++; } }
  • 18. Β. ∆είκτες και Πίνακες 3. Αριθµητική ∆εικτών 18∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Για την ώρα µπορεί να µην φαίνεται χρήσιµο, γιατί να κάνουµε πρόσβαση στα στοιχεία του πίνακα µε αυτόν τον τρόπο! Αργότερα όµως θα δούµε πραγµατικά χρήσιµες εφαρµογές αυτής της ιδιότητας. Ας δούµε όµως ένα ακόµη παράδειγµα: Η εντολή ptr+=2 λοιπόν θα αυξήσει την τιµή της ptr κατα 2 x (το µέγεθος του double), άρα θα αυξήσει τη διεύθυνση κατά 16, αφού µία double µεταβλητή δεσµεύει 8 bytes. Μετά το πέρας της εκτέλεσης αυτών των εντολών ο δείκτης ptr θα δείχνει στο στοιχείο pinakas[2]. double pinakas[100]; double *ptr; ptr=pinakas; ptr+=2;
  • 19. Β. ∆είκτες και Πίνακες 4. Ισοδύναµος Συµβολισµός για την Πρόσβαση σε Πίνακα 19∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Με βάση την αριθµητική δεικτών, η παράσταση: Μπορεί να εξηγηθεί ως εξής: Το (array+2) δίνει την διεύθυνση του 3ου στοιχείου του πίνακα. Άρα µε το * µπροστά, µας δίνει την τιµή του 3ου στοιχείου του πίνακα. Έτσι για παράδειγµα ο βρόχος: µπορεί να γραφεί ισοδύναµα: *(array+2) for (i=0; i<N; i++) printf("%d",array[i]); for (i=0; i<N; i++) printf("%d",*(array+i));
  • 20. Γ. ∆είκτες και Συναρτήσεις 1. ∆ιοχέτευση ∆είκτη σε Συνάρτηση 20∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Από τη στιγµή που ένας δείκτης µπορεί να ειδωθεί σαν µια µεταβλητή (στην οποία αποθηκεύονται διευθύνσεις µεταβλητών), έχουµε κάθε δικαίωµα να τον περάσουµε ως όρισµα σε µια συνάρτηση. Π.χ. Το ακόλουθο πρωτότυπο συνάρτησης: ∆έχεται ως ορίσµατα δύο πράγµατα: Έναν δείκτη σε ακέραιο (το p) και έναν ακέραιο (το x) Μπορεί βεβαίως και από µία συνάρτηση να επιστραφεί ένας δείκτης σε µια µεταβλητή. Το πρωτότυπο µιας τέτοιας συνάρτησης θα είναι: Όπου στο σώµα της συνάρτησης θα ορίζουµε ότι επιστρέφεται ένας δείκτης σε ακέραια µεταβλητή. Μας ενδιαφέρει αυτό; ΠΑΡΑ ΠΟΛΥ! Το πως περνάµε µια µεταβλητή (µέσω µεταβλητής ή µέσω δείκτη) είναι από τις πιο σηµαντικές προγραµµατιστικές τεχνικές της C! int func(int *p, int x) int *func2(float y)
  • 21. Γ. ∆είκτες και Συναρτήσεις 2. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Τιµής 21∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Στο µάθηµα 6 «Συναρτήσεις», είδαµε ότι κάθε συνάρτηση έχει τον δικό της χώρο µεταβλητών στην µνήµη. Ας µελετήσουµε για να θυµηθούµε τις ιδιότητες αυτές ένα απλό πρόγραµµα. /*byvalue.c: Perasma orismatwn mesw timis */ #include <stdio.h> void swap(int a,int b); main() { int a=5,b=10; printf("nMain: a=%d,b=%d",a,b); swap(a,b); printf("nMain: a=%d,b=%d",a,b); } void swap(int a, int b) { int k; k=a; a=b; b=k; printf("nSwap: a=%d,b=%d",a,b); }
  • 22. Γ. ∆είκτες και Συναρτήσεις 2. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Τιµής 22∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Ας θυµηθούµε πως δουλεύει το πρόγραµµα αυτό. Πριν την κλήση της συνάρτησης swap, οι µεταβλητές a και b έχουν πάρει τις τιµές a=5 και b=10. Συνεπώς όταν γίνεται η κλήση της swap, τα ορίσµατα a, και b της συνάρτησης swap έχουν αντίστοιχα τιµές 5 και 10. Η εικόνα της µνήµης είναι: Αφού εκτελεστούν οι εντολές της swap, αλλάζουν οι τιµές των a και b στην swap, αλλά επειδή αυτές είναι τοπικές µεταβλητές στην swap η τιµή των a,b στην main δεν αλλάζει! Η εικόνα της µνήµης είναι: a b … Χώρος της main 5 Χώρος της swap a b 510 10 a b … Χώρος της main 5 Χώρος της swap a b 1010 5
  • 23. Γ. ∆είκτες και Συναρτήσεις 2. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Τιµής 23∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Πρακτικά, όταν περνάµε ορίσµατα µέσω µεταβλητών, οι αλλαγές που γίνονται στις µεταβλητές που διοχετεύουµε ως ορίσµατα, δεν θα εξακολουθούν να υφίστανται όταν ο έλεγχος του προγράµµατος επιστρέψει στη καλούσα συνάρτηση. Αυτός ο τρόπος για να περάσουµε ένα όρισµα σε µια συνάρτηση λέγεται διοχέτευση ορίσµατος σε συνάρτηση µέσω τιµής (by value) υπό την έννοια ότι στην συνάρτηση έχουµε στα χέρια µας την τιµή της µεταβλητής και όχι την ίδια την µεταβλητή. Είναι προφανές ότι σε κάποιες συναρτήσεις θα επιθυµούµε να αλλάζει η τιµή της µεταβλητής µέσα στην συνάρτηση και αυτό να µπορεί να το «δει» και η καλούσα συνάρτηση. Αυτός είναι ο δεύτερος τρόπος για να περάσουµε ένα όρισµα σε µια συνάρτηση, λέγεται διοχέτευση ορίσµατος σε συνάρτηση µέσω αναφοράς (by reference) και όπως θα δούµε στην συνέχεια δεν διοχετεύουµε ως όρισµα την µεταβλητή, αλλά δείκτη στην µεταβλητή!
  • 24. Γ. ∆είκτες και Συναρτήσεις 3. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Αναφοράς 24∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Άρα τροποποιούµε την συνάρτηση µας ως εξής: /*byreference.c: Perasma orismatwn mesw anaforas */ #include <stdio.h> void swap(int *ptrA, int *ptrB); main() { int a=5,b=10; printf("nMain: a=%d,b=%d",a,b); swap(&a,&b); printf("nMain: a=%d,b=%d",a,b); } void swap(int *ptrA, int *ptrB) { int k; k=*ptrA; *ptrA=*ptrB; *ptrB=k; printf("nSwap: a=%d,b=%d",*ptrA,*ptrB); }
  • 25. Γ. ∆είκτες και Συναρτήσεις 3. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Αναφοράς 25∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Να δούµε πως δουλεύει το πρόγραµµα αυτό. Πριν την κλήση της συνάρτησης swap, οι µεταβλητές a και b έχουν πάρει τις τιµές a=5 και b=10. Ας υποθέσουµε ότι η διεύθυνση της a είναι 1000 και της b 1012. Η τιµή &a, υπολογίζεται στο 1000, ενώ η τιµή &b υπολογίζεται στο 1012. Συνεπώς όταν αρχίζει η εκτέλεση της swap η εικόνα της µνήµης είναι: a b … Χώρος της main 5 Χώρος της swap ptrA 10 a b … Χώρος της main 5 Χώρος της swap 100010 1000 1012 ptrB 1000 1012 ptrA ptrB 1012
  • 26. Γ. ∆είκτες και Συναρτήσεις 3. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Αναφοράς 26∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Ας δούµε τώρα αναλυτικά τις εντολές που τρέχουν στην swap: k=*ptrA; //Αναθέτει στην µεταβλητή k την τιµή της µεταβήτης που δείχνει ο ptrA *ptrA=*ptrB; Αναθέτει στην µεταβλητή που δείχνει ο ptrA την τιµή που δείχνει ο ptrB *ptrB=k; Αναθέτει στην µεταβλητή που δείχνει ο ptrB την τιµή του k a b … Χώρος της main 5 Χώρος της swap 100010 1000 1012 ptrA ptrB 1012 k 5 a b … Χώρος της main 10 Χώρος της swap 100010 1000 1012 ptrA ptrB 1012 k 5 a b … Χώρος της main 10 Χώρος της swap 10005 1000 1012 ptrA ptrB 1012 k 5
  • 27. Γ. ∆είκτες και Συναρτήσεις 3. ∆ιοχέτευση Ορίσµατος σε Συνάρτηση Μέσω Αναφοράς 27∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Τι παρατηρούµε: Ότι µε έµµεσο τρόπο η συνάρτηση προσπελαύνει τις ίδιες τις µεταβλητές της main! Άρα για τον λόγο αυτό, οι αλλαγές που κάνουµε στις µεταβλητές παραµένουν και στην main! Συνοψίζοντας: Αν θέλουµε να αλλάξει η τιµή µια µεταβλητής σε µια συνάρτηση και το αποτέλεσµα αυτό να διατηρηθεί και στην καλούσα συνάρτηση, διοχετεύουµε το όρισµα µέσω αναφοράς (δηλαδή µέσω δείκτη) Αλλιώς διοχετεύουµε το όρισµα απλά µέσω τιµής. Επιπλέον: ∆είτε ότι µε τον τρόπο αυτό µπορούµε να έχουµε περισσότερα από ένα επιστρεφόµενα αποτελέσµατα. Το ένα επιστρεφόµενο αποτέλεσµα θα το πάρουµε από την return και το άλλο µέσω δείκτη! Ή ακόµη πιο απλά µπορούµε να πάρουµε και τις δύο επιστρεφόµενες τιµές µέσω δείκτη.
  • 28. ∆. Παρατηρήσεις 1. ∆ιοχέτευση Πίνακα ως Όρισµα σε Συνάρτηση 28∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Σηµείωση: Επειδή είναι πολύ συνηθισµένο να διοχετεύουµε έναν πίνακα ως όρισµα, και για να είναι πιο εµφανές στην ανάγνωση ότι πρόκειται περί πίνακα και όχι δείκτη σε µεταβλητή, η C µας δίνει την δυνατότητα: Αντί να γράψουµε το πρωτότυπο: Να γράψουµε το πρωτότυπο: Οποιοδήποτε από τα δύο πρωτότυπα και να χρησιµοποιήσουµε θα έχουµε το ίδιο αποτέλεσµα. void print(int *pinakas, int n); void print(int pinakas[], int n); Με βάση τα παραπάνω εξ’ ορισµού το πέρασµα ενός πίνακα σε µία συνάρτηση γίνεται µέσω αναφοράς. Άρα θα θυµόµαστε ότι οποιαδήποτε αλλαγή γίνεται σε έναν πίνακα που διοχετεύουµε ως όρισµα, παραµένει και στην καλούσα συνάρτηση. Αν θέλουµε να περάσουµε αντίγραφο του πίνακα ως όρισµα σε µία συνάρτηση, θα πρέπει να κατασκευάσουµε πρώτα ένα αντίγραφό του.
  • 29. ∆. Παρατηρήσεις 2. Η Σταθερά NULL 29∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Ένα πολύ συνηθισµένο λάθος είναι να καταχωρούµε τιµή σε έναν δείκτη που δεν τον έχουµε συσχετίσει µε µια µεταβλητή. Π.χ. ο κώδικας: Θα δηµιουργήσει σφάλµα εκτέλεσης! Το p δεν δείχνει πουθενά, άρα όταν πάµε να εκτελέσουµε την εντολή δεν επηρεάζουµε κάποια µεταβλητή, άρα το πρόγραµµα έχει µια απροσδόκητη συµπεριφορά! Συνεπώς πάντα όταν δηλώνουµε ένα δείκτη, θα πρέπει να τον συσχετίζουµε µε µια µεταβλητή η οποία θα είναι αποθηκευµένη στην µνήµη. Θα υπάρξουν και κάποιες περιπτώσεις που θα θέλουµε ο δείκτης να µην έχει τιµή. Για τον λόγο αυτό στην C είναι ορισµένη µία συµβολική σταθερά, το NULL, την οποία θα την χρησιµοποιούµε συµβολικά για να λέµε ότι «ο δείκτης δεν δείχνει πουθενά». Παράδειγµα: int x; int *p; *p=15; int *p; p=NULL; /* O p δεν δείχνει πουθενά */
  • 30. Ε. Ασκήσεις 1. Υπολογισµός Ριζών Β’Βάθµιας Εξίσωσης 30∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες 1. Γράψτε µια συνάρτηση µε όνοµα: • Η οποία να υπολογίζει τις ρίζες της εξίσωσης ax2+bx+c=0. Η συνάρτηση να επιστρέφει (µέσω ορίσµατος) στις µεταβλητές x1 και x2 τις πραγµατικές ρίζες της εξίσωσης και να επιστρέφει µε return το πλήθος των λύσεων της εξίσωσης • Βοήθεια: Θα χρειαστείτε την συνάρτηση: • Η οποία είναι ορισµένη στο αρχείο κεφαλίδας math.h • Βοήθεια: Ο προσδιοριστής των printf, scanf για τύπο δεδοµένων float είναι %f (αντί για %d στους ακεραίους) 2. Έπειτα γράψτε µια συνάρτηση main, που θα διαβάζει από την είσοδο τις τιµές των a,b,c (συντελεστές της εξίσωσης) και αφού εκτελέσει την συνάρτηση rizes θα εκτυπώνει τα κατάλληλα µηνύµατα µε τις ρίζες της β’ βάθµιας εξίσωης. int rizes(float a, float b, float c, float *x1, float *x2); double sqrt(double x);
  • 31. Ε. Ασκήσεις 2. Συνάρτηση init_array 31∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες 1. Γράψτε την συνάρτηση: void init_array(int *pinakas, int n, int a, int b) που να αρχικοποιεί έναν πίνακα n ακεραίων, µε τυχαίους αριθµούς στο διάστηµα [a..b] 2. Ελέγξτε την ορθότητα της συνάρτησής σας µε κατάλληλα παραδείγµατα
  • 32. Ε. Ασκήσεις 3. Συνάρτηση print_array 32∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Επεκτείνετε το πρόγραµµα της προηγούµενης άσκησης: 1. Γράψτε την συνάρτηση: void print_array(int *pinakas, int n) που να τυπώνει τα περιεχόµενα του πίνακα ακεραίων pinakas. 2. Ελέγξτε την ορθότητα της συνάρτησής σας µε κατάλληλα παραδείγµατα
  • 33. Ε. Ασκήσεις 4. Συνάρτηση max_array 33∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Επεκτείνετε το πρόγραµµα της προηγούµενης άσκησης: 1. Γράψτε την συνάρτηση: int max_array(int *pinakas, int n) που να επιστρέφει τον µέγιστο στοιχείο του πίνακα ακεραίων pinakas 2. Ελέγξτε την ορθότητα της συνάρτησής σας µε κατάλληλα παραδείγµατα
  • 34. Ε. Ασκήσεις 5. Ένα Πολύπλοκο Πρόγραµµα 34∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 8: ∆είκτες Συνεχίζοντας το προηγούµενο παράδειγµα, γράψτε µία συνάρτηση main η οποία: 1. Να δηλώνει έναν πίνακα ακεραίων 1000 θέσεων 2. Μέσα από ένα επαναλαµβανόµενο βρόχο να δίνει 6 επιλογές στον χρήστη: 1. Να εισάγει το µέγεθος του πίνακα 2. Να αρχικοποιεί µε τυχαίους αριθµούς από το a έως το b τα στοιχεία του πίνακα, όπου a και b είναι αριθµοί που ζητούνται από το χρήστη. 3. Να βρίσκει τον µέγιστο του πίνακα και να τον τυπώνει 4. Να τυπώνει όλα τα στοιχεία του πίνακα 5. Να κάνει έξοδο από τον επαναλαµβανόµενο βρόχο