Βασικές Έννοιες Εισόδου-Εξόδου Πίνακες και Δείκτες

Slides:



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

ΠΙΝΑΚΕΣ ΜΑΘΗΜΑ 6.
Εισαγωγή στους Η/Υ Πίνακες.
Προγραμματισμός Ι Πίνακες •Ο πίνακας είναι μία συλλογή μεταβλητών ίδιου τύπου, οι οποίες είναι αποθηκευμένες σε διαδοχικές θέσεις μνήμης. Χρησιμοποιείται.
Δείκτες, Πίνακες και Δείκτες, Δείκτες σε Συναρτήσεις
Αναδρομη και static Γραψετε την συναρτηση sequence_size που διαβαζει μια απροσδιοριστου μεγεθους σειρας και υπολογιζει και τυπωνει το μεγεθος της. int.
Αντικειμενοστραφής Προγραμματισμός
ΜΑΘ 3122 (106) Γλώσσα προγραμματισμού
Μάθημα : Βασικά Στοιχεία της Γλώσσας Java
ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΙΑΔΙΚΑΣΤΙΚΟ ΠΡΟΓΡΑΜMΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ – ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ.
Τύποι πραγματικών αριθμών
Συναρτήσεις Κληση/Επιστροφη Παραμετροι
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος γ
ΗΥ-150 Προγραμματισμός Εντολές Ελέγχου Ροής.
Τελεστές ανάθεσης (assignment)
ΜΕΤΑΒΛΗΤΕΣ - ΤΥΠΟΙ ΜΑΘΗΜΑ 3.
ΕΠΑΝΑΛΗΨΗΕΠΑΝΑΛΗΨΗ ΠΡΟΓΡΑΜΜΑΤΑ. ΠΡΟΓΡΑΜΜΑ 1 ΕΞΗΓΗΣΤΕ ΤΙ ΕΞΟΔΟ ΠΑΡΑΓΕΙ ΤΟ ΠΑΡΑΚΑΤΩ ΠΡΟΓΡΑΜΜΑ #include int main() { char ch; int i; float fl; printf("dose.
Η ΓΛΩΣΣΑ C ΜΑΘΗΜΑ 2.
Υποθετικός τελεστής Ο υποθετικός τελεστής (?:) αποτελείται από δύο σύμβολα. Ανήκει στην κατηγορία των τελεστών που αποτελούνται από συνδυασμό συμβόλων.
Δείκτες, Πίνακες σε Δείκτες, Δείκτες σε Συναρτήσεις
ΣΥΝΑΡΤΗΣΕΙΣ.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ
MΑΘ 106/3122Ξενοφών Ζαμπούλης ΜΑΘ 106/3122 Γλώσσα Προγραμματισμού Δείκτες (Pointers)
Μετατροπή Εκφράσεων σε C
ΜΑΘ 3122/106 – Γλώσσα Προγραμματισμού Ξενοφών Ζαμπούλης ΜΑΘ-3122/106 Γλώσσα Προγραμματισμού Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
2/28/00epl-1311 Παραδειγματα Aλγοριθμων Αριθμος λεξεων που διαβαστηκαν απο εισοδο Εκτυπωση περιφερειας τετραγωνων με * Υπολογισμος exp(x,n) = 1 + x/1!
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ -150 Προγραμματισμός Αρχεία.
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
ΗΥ150 – ΠρογραμματισμόςΞ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Αρχεία.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Πίνακες (Arrays)
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αλφαριθμητικά (Strings)
ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
Βασικά στοιχεία της Java
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις (μέρος δεύτερο) και Μεταβλητές.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
TEXNΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ – ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Προγραμματισμός ΗΥ Ενότητα 2: Συναρτήσεις Εισόδου ⁄ Εξόδου. Διδάσκων: Ηλίας Κ Σάββας, Αναπληρωτής Καθηγητής.
Εισαγωγή - Τα Βασικά της C1 Τ.Ε.Ι. ΛΑΜΙΑΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ Τ.Ε.Ι. ΛΑΜΙΑΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ «Προγραμματισμός.
ΔΠΘ-ΤΜΗΜΑ ΜΠΔ: ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ 1 Εισαγωγή στη γλώσσα Προγραμματισμού C ΠΙΝΑΚΕΣ (arrays)
ΔΟΜΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΕ C 1.Σχόλια 2.Οδηγίες προεπεξεργαστή 3.Ορισμοί τύπων 4.Δηλώσεις συναρτήσεων (πρωτότυπα) 5.Ορισμός της main 6.Ορισμοί συναρτήσεων.
ΜΕΤΑΒΛΗΤΕΣ-ΣΤΑΘΕΡΕΣ -ΕΚΦΡΑΣΕΙΣ
Προτάσεις, εκφράσεις, τελεστές Βασικά στοιχεία ελέγχου προγράμματος
Επανάληψη.
Ενισχυτική διδασκαλία
Πίνακες και αλφαριθμητικά
Δείκτες Προγραμματισμός Ι
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Δομές.
Ενισχυτική διδασκαλία
Ενισχυτική διδασκαλία
ΕΝΤΟΛΕΣ ΕΠΙΛΟΓΗΣ Η εντολή if if ( παράσταση) εντολή επόμενη εντολή.
for (παράσταση_1; παράσταση_2; παράσταση_3)
Τύποι Μεταβλητών.
Τεχνολογία και Προγραμματισμός Υπολογιστών
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
ΣΥΝΑΡΤΗΣΕΙΣ (Functions)
Ενότητα 9: Δείκτες και Δυναμική Διαχείριση Μνήμης.
Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος
Ειδικά Θέματα στον Προγραμματισμό Υπολογιστών
Εισαγωγή στον Προγ/μό Υπολογιστών
Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον ΑΕΠΠ
ΗΥ-150 Προγραμματισμός Αναδρομή (1/2).
[Μονοδιάστατοι πίνακες]
Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου
ΑΣΚΗΣΕΙΣ.
Μεταγράφημα παρουσίασης:

Βασικές Έννοιες Εισόδου-Εξόδου Πίνακες και Δείκτες

printf() Πιθανά ορίσματα: Κυριολεκτικό κείμενο Ακολουθία διαφυγής Επιτρέπει την εμφάνιση ειδικών χαρακτήρων Προσδιοριστής μετατροπής Καθορίζει πώς θα ερμηνευτούν οι μεταβλητές που πρόκειται να προβληθεί

Ακολουθίες διαφυγής \a Κουδούνι \n Νέα γραμμή \\ ανάστροφη κεκλιμένη γραμμή \? ερωτηματικό \' απόστροφος \" εισαγωγικό \t χαρακτήρας στηλοθέτη

Προσδιοριστές μετατροπής %c char %d int, short %f float %s συμβολοσειρές %u μη προσημασμένοι ακέραιοι

Παράδειγμα (1/3) /* Demonstration of frequently used escape sequences */ #include <stdio.h> #define QUIT 3 int get_menu_choice( void ); void print_report( void ); int main(void) { int choice = 0; while( choice != QUIT ) { choice = get_menu_choice(); if( choice == 1 ) printf( "\nBeeping the computer\a\a\a" ); else { if( choice == 2 ) print_report(); }

Παράδειγμα (2/3) printf( "You chose to quit!" ); } /*main*/ int get_menu_choice( void ) { int selection = 0; do { printf( "\n" ); printf( "\n1 - Beep Computer" ); printf( "\n2 - Display Report"); printf( "\n3 - Quit"); printf( "\nEnter a selection:" ); scanf( "%d", &selection ); }while ( selection < 1 || selection > 3 ); return selection; }

Παράδειγμα (3/3) void print_report( void ) { printf( "\nSAMPLE REPORT" ); printf( "\n\nSequence\tMeaning" ); printf( "\n=========\t=======" ); printf( "\n\\a\t\tbell (alert)" ); printf( "\n\\b\t\tbackspace" ); printf( "\n...\t\t..."); }

Παράδειγμα (1/1) /* Demonstration using print() to display numerical values. */ #include <stdio.h> int a = 2, b = 10, c = 50; float f = 1.05, g = 25.5, h = -0.1; int main(void) { printf("\nDecimal values without tabs: %d %d %d", a, b, c); printf("\nDecimal values with tabs: \t%d \t%d \t%d", a, b, c); printf("\nThree floats on 1 line: \t%f\t%f\t%f", f, g, h); printf("\nThree floats on 3 lines: \n\t%f\n\t%f\n\t%f",f,g,h); printf("\nThe rate is %f%%", f); printf("\nThe result of %f/%f = %f", g, f, g / f); }

Προσοχή Για κάθε μεταβλητή που προβάλλουμε πρέπει να υπάρχει αντίστοιχος προσδιοριστής Εάν υπάρχουν περισσότερες μεταβλητές ΔΕΝ θα προβληθούν Εάν υπάρχουν περισσότεροι προσδιοριστές θα εμφανιστούν 'σκουπίδια'

Προσοχή Καλύτερα να προβάλλετε πολλές γραμμές κειμένου με περισσότερες εντολές printf(). Βοηθά στην αναγνωσιμότητα του κώδικα. Μην ξεχνάτε το αρχείο stdio.h

puts() Η puts() μπορεί να εμφανίσει μηνύματα κειμένου όχι όμως και μεταβλητές puts("Καλημέρα κόσμε"); printf("Καλημέρα κόσμε\n"); Μπορείτε να χρησιμοποιήσετε ακολουθίες διαφυγής Δε μπορείτε να χρησιμοποιήσετε προσδιοριστές μετατροπής

scanf() Απαιτείται το σύμβολο & πριν το όνομα της μεταβλητής scanf("%d", &x); scanf("%f", &f); scanf("%d, %f", &x, &f); Απαιτείται το σύμβολο & πριν το όνομα της μεταβλητής Οι τιμές που εισάγονται διαχωρίζονται με κενό, tab, ή νέα γραμμή

Παράδειγμα (1/3) /* Demonstration on using scanf() */ #include <stdio.h> #define QUIT 4 int get_menu_choice( void ); int main(void) { int choice = 0; int int_var = 0; float float_var = 0.0; unsigned unsigned_var = 0; while( choice != QUIT ) { choice = get_menu_choice(); if( choice == 1 ) { puts( "\nEnter a signed decimal integer (i.e. -123)" ); scanf( "%d", &int_var ); }

Παράδειγμα (2/3) if ( choice == 2 ) { puts( "\nEnter a decimal floating point number (i.e. 1.23)" ); scanf( "%f", &float_var ); } if ( choice == 3 ) { puts( "\nEnter an unsigned decimal integer (i.e. 123)" ); scanf( "%u", &unsigned_var ); printf( "\nYour values are: int: %d float: %f unsigned: %u ",int_var, float_var, unsigned_var );

Παράδειγμα (3/3) int get_menu_choice( void ) { int selection = 0; do { puts( "\n1 - Get an signed decimal integer" ); puts( "2 - Get a decimal floating point number" ); puts( "3 - Get an unsigned decimal integer" ); puts( "4 - Quit" ); puts( "\nEnter a selection:" ); scanf( "%d", &selection ); }while ( selection < 1 || selection > 4 ); return selection; }

Βρείτε τα σφάλματα printf("\n I say: "Good morning""); int get_1_or_2(void) { int answer = 0; while (answer < 1 || answer > 2) { printf(Enter 1 for Yes, 2 for No); scanf(answer); } return answer;

Λίγα για πίνακες (1/3) Πίνακας (διάταξη): μια ομάδα στοιχείων ιδίου τύπου Τα στοιχεία διαχωρίζονται μεταξύ τους με χρήση δείκτη Πίνακας: μια ή περισσότερες διαστάσεις Ορισμός: int data[1000]; Ορίζει έναν πίνακα με 1000 θέσεις ακεραίων Το πρώτο στοιχείο βρίσκεται στη θέση data[0]

Λίγα για πίνακες (2/3) Μπορούμε να δώσουμε τιμή σε μια θέση του πίνακα: data[10] = 12; ή εάν έχουμε ορίσει int count = 10; data[count] = 12; Ποιος είναι ο δείκτης του τελευταίου στοιχείου του πίνακα data[] ;

Λίγα για πίνακες (3/3) Ο πίνακας μπορεί να έχει πάνω από μία διαστάσεις char crossword[15][15]; πίνακας χαρακτήρων 15 γραμμών και 15 στηλών int a[50][100]; πίνακας ακεραίων με 50 γραμμές και 100 στήλες double b[10][20][30]; Αναφερόμαστε σε ένα στοιχείο του πίνακα παραθέτοντας δείκτες για όλες τις διαστάσεις crossword[3][5] = 'A'; b[2][7][9] = 7.2;

Περισσότεροι Πίνακες Είδαμε τους μονοδιάστατους πίνακες Με τη δήλωση ενός πίνακα ο μεταγλωττιστής κρατά αντίστοιχο χώρο στη μνήμη

Παραδείγματα float expenses[100]; int a[10]; int i = 5; expenses[i] = 100; expenses[2 + 3] = 100; a[2] = 5; expenses[a[2]] = 100;

Πολυδιάστατοι πίνακες int checker[8][8]; checker[0][0] = 1; checker[1][0] = 2; #define MONTHS 12 int array[MONTHS] /* Δεκτό */ const int MONTHS=12; int array[MONTHS] /* Λάθος! */

Απόδοση αρχικών τιμών int array[4] = {100, 200, 300, 400}; int array[] = {100, 200, 300, 400}; int array[14] = {100, 200, 300, 400}; int array[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; array[0][0] = 1; array[0][1] = 2; array[0][2] = 3; array[1][0] = 4; array[1][1] = 5; array[1][2] = 6; ... array[3][2] = 12;

Απόδοση αρχικών τιμών Δεκτό: int array[][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; Μη δεκτό: int array[3][] = {1,2,3,4,5,6,7,8,9,10,11,12};

Παράδειγμα (1/2) /* Demonstrates the sizeof() operator */ #include <stdio.h> /* Declare several 100 element arrays */ int intarray[100]; float floatarray[100]; double doublearray[100]; int main(void) { /* Display the sizes of numeric data types */ printf("\n\nSize of int = %d bytes", sizeof(int)); printf("\nSize of short = %d bytes", sizeof(short)); printf("\nSize of long = %d bytes", sizeof(long)); printf("\nSize of float = %d bytes", sizeof(float)); printf("\nSize of double = %d bytes", sizeof(double));

Παράδειγμα (2/2) /* Display the sizes of the three arrays */ printf("\nSize of intarray = %d bytes", sizeof(intarray)); printf("\nSize of floatarray = %d bytes", sizeof(floatarray)); printf("\nSize of doublearray = %d bytes", sizeof(doublearray)); }

Ερωτήσεις Τι συμβαίνει αν χρησιμοποιήσω έναν δείκτη εκτός του αριθμού των στοιχείων του πίνακα; Τι συμβαίνει αν χρησιμοποιήσω έναν πίνακα χωρίς να δώσω αρχικές τιμές; Πόσες διαστάσεις μπορεί να έχει ένας πίνακας; Υπάρχει εύκολος τρόπος απόδοσης αρχικών τιμών σε ένα πίνακα; Μπορώ να κάνω πράξεις πινάκων;

Βρείτε το σφάλμα int x, y; int array[10][3]; int main(void){ for (x = 0; x < 3; x++) for (y = 0; y < 10; y++) array[x][y] = 0; return 0; }

Βρείτε το σφάλμα int x = 1; int array[10]; int main(void){ for (x = 1; x <= 10; x++) array[x] = 0; return 0; }

Δείκτες

Η μνήμη του υπολογιστή Η μνήμη αποτελείται από διαδοχικές θέσεις αποθήκευσης Κάθε θέση αναγνωρίζεται από μοναδική διεύθυνση (0…μέγιστη μνήμη) Όταν δηλώνετε μια μεταβλητή δεσμεύεται μια αντίστοιχη θέση στη μνήμη Η διεύθυνση της μνήμης δεν είναι άμεσα γνωστή σε εσάς

Δημιουργία δείκτη Η διεύθυνση είναι ένας αριθμός! Μπορείτε, για παράδειγμα, σε μια μεταβλητή να αποθηκεύσετε τη διεύθυνση μνήμης μιας άλλης μεταβλητής Δείτε τα ακόλουθα παραδείγματα

Ορισμός μεταβλητής 1000 1001 1002 1003 1004 1005 1006 1007 100 rate ? 100 p_rate rate 1000 1001 1002 1003 1004 1005 1006 1007 1004 100 p_rate rate

Δήλωση δεικτών Για να ξεχωρίζουμε εύκολα τους δείκτες, στα παραδείγματα χρησιμοποιούμε το p_ Δήλωση δείκτη: τύπος *όνομα_δείκτη; char *ch1, *ch2; float *value, percent; ο αστερίσκος είναι ο τελεστής έμμεσης διευθυνσιοδότησης

Αρχικοποίηση δεικτών Για να δώσετε τη διεύθυνση μιας μεταβλητής σε ένα δείκτη χρησιμοποιείτε τον τελεστή διεύθυνσης (&) δείκτης = &μεταβλητή; p_rate = &rate; Πριν την απόδοση τιμής η p_rate δεν 'έδειχνε' σε κάτι συγκεκριμένο.

Χρήση δεικτών Όταν το * προτίθεται στο όνομα ενός δείκτη αναφερόμαστε στη μεταβλητή που δείχνει ο δείκτης! οπότε τα επόμενα είναι ισοδύναμα: printf("%d", rate); printf("%d", *p_rate);

Χρήση δεικτών Άμεση πρόσβαση: αναφορά στο όνομα μιας μεταβλητής Έμμεση πρόσβαση: πρόσβαση με χρήση δείκτη Δείτε το ακόλουθο παράδειγμα

Παράδειγμα αναφοράς 1000 1001 1002 1003 1004 1005 1006 1007 1004 100 p_rate rate *p_rate *p_rate : η τιμή που έχει η θέση μνήμης p_rate

Ερωτήσεις Έστω ότι έχετε τις ακόλουθες δηλώσεις: int *ptr, var = 5; ptr = &var; Σε τι αναφέρονται τα ακόλουθα: *ptr, var, ptr, &var Εκτελέστε το ακόλουθο παράδειγμα.

Παράδειγμα /* Demonstrates basic pointer use. */ #include <stdio.h> /* Declare and initialize an int variable */ int var = 1; /* Declare a pointer to int */ int *ptr; int main(void) { /* Initialize ptr to point to var */ ptr = &var; /* Access var directly and indirectly */ printf("\nDirect access, var = %d", var); printf("\nIndirect access, var = %d", *ptr); /* Display the address of var two ways */ printf("\n\nThe address of var = %d", &var); printf("\nThe address of var = %d", ptr); }

Προσοχή ΜΗ χρησιμοποιείτε δείκτη χωρίς να του έχετε δώσει αρχική τιμή. ΜΗ χρησιμοποιείτε δείκτη χωρίς να του έχετε δώσει αρχική τιμή. Προσέξτε τις διαφορές ανάμεσα στα ptr και *ptr Π.χ. τι κάνει η ακόλουθη δήλωση; *ptr = 120;

Δείκτες και Τύποι μεταβλητών Διαφορετικοί τύποι μεταβλητών καταλαμβάνουν διαφορετικό χώρο στη μνήμη Η διεύθυνση μιας μεταβλητής είναι η διεύθυνση του πρώτου byte που καταλαμβάνει Δείτε το ακόλουθο παράδειγμα

Παράδειγμα (1/2) int integer_variable = 12252; char character_variable = 90; float real_variable = 1200.356; Η int καταλαμβάνει 2 bytes, η char καταλαμβάνει 1 byte, η float καταλαμβάνει 4 bytes.

Παράδειγμα (2/2) character_variable real_variable integer_variable 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 12252 90 1200.356 int *p_integer; char *p_character; float *p_real; p_integer = &integer_variable; p_character = &character_variable; p_real = &real_variable;

Το όνομα πίνακα ως δείκτης Ένα όνομα πίνακα χωρίς αγκύλες είναι ένας δείκτης στο πρώτο στοιχείο του πίνακα data == &data[0] είναι αληθής έκφραση Ως δείκτης δεν μπορεί να αλλάξει (δείχνει πάντα στην ίδια θέση) Μπορείτε να βάλετε έναν άλλο δείκτη να δείχνει στον πίνακα int array[100], *p_array; p_array = array; /* Δε χρειάζεται ο & */

Αποθήκευση στοιχείων πίνακα int array[5]; 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 array[0] array[1] array[2] array[3] array[4] Η array (χωρίς αγκύλες) είναι η διεύθυνση του πρώτου στοιχείου του πίνακα float expenses[2]; 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 expenses[0] expenses[1]

Αριθμητική δεικτών Έστω ότι ptr_2_int είναι μεταβλητή-δείκτης προς κάποιο στοιχείο ενός πίνακα ακεραίων Εάν το αυξήσετε η τιμή του (εφόσον είναι τύπου int) αυξάνει κατά δύο ώστε να δείχνει στο επόμενο στοιχείο του πίνακα Αντίστοιχα για float θα αυξηθεί κατά 4

Παράδειγμα /* Δείχνει τη χρήση της αριθμητικής δεικτών για πρόσβαση σε στοιχεία πίνακα με σημειογραφία δεικτών */ #include <stdio.h> #define MAX 10 int i_array[MAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int *i_ptr, count; float f_array[MAX] = {.0,.1,.2,.3,.4,.5,.6,.7,.8,.9}; float *f_ptr; int main(void){ i_ptr = i_array; f_ptr = f_array; for (count = 0; count < MAX; count++) printf("%d\t%f\n", *i_ptr++, *f_ptr++); return 0; }

Προσοχή Τι θα συμβεί αν γράψω το ακόλουθο; int *ptr; *ptr = 12; Αφαίρεση ή πρόσθεση σε δείκτη τον αλλάζει ανάλογα με τον τύπο του! *(array) == array[0] ; *(array + 1) == array[1]; *(array + 2) == array[2] . . . *(array + n) == array[n]

Πίνακας ως όρισμα συνάρτησης Μια συνάρτηση δεν μπορεί να δεχτεί ως όρισμα ολόκληρο πίνακα Η λύση: δέχεται δείκτη! Επόμενο πρόβλημα: πώς θα φτιάξετε μια γενική συνάρτηση Ειδική τιμή Μέγεθος πίνακα

Παράδειγμα (1/2) /* Passing an array to a function. */ #include <stdio.h> #define MAX 10 int array[MAX], count; int largest(int x[], int y); int main(void) { /* Input MAX values from the keyboard. */ for (count = 0; count < MAX; count++) { printf("Enter an integer value: "); scanf("%d", &array[count]); } /* Call the function and display the return value. */ printf("\n\nLargest value = %d", largest(array, MAX));

Παράδειγμα (2/2) /* Function largest() returns the largest value */ /* in an integer array */ int largest(int x[], int y) { int count, biggest = -12000; for ( count = 0; count < y; count++) { if (x[count] > biggest) /* Πώς θα το γράφαμε ως δείκτη;;;; */ biggest = x[count]; } return biggest;

Παράδειγμα (1/2) /* Εναλλακτική λύση */ /* Passing an array to a function. Alternative way. */ #include <stdio.h> #define MAX 10 int array[MAX+1], count; int largest(int x[]); int main(void) { /* Input MAX values from the keyboard. */ for (count = 0; count < MAX; count++) { printf("Enter an integer value: "); scanf("%d", &array[count]); if ( array[count] == 0 ) count = MAX; /* will exit for loop */ } array[MAX] = 0;

Παράδειγμα (2/2) /* Call the function and display the return value. */ printf("\n\nLargest value = %d", largest(array)); } /* End MAIN */ /* Function largest() returns the largest value */ /* in an integer array */ int largest(int x[]) { int count, biggest = -12000; for ( count = 0; x[count] != 0; count++) { if (x[count] > biggest) biggest = x[count]; } return biggest;