Οι πίνακες στην C |
Ο πίνακας είναι μια αρκετά διαδεδομένη δομή που υπάρχει σε κάθε σχεδόν γλώσσα προγραμματισμού. Οι πίνακες μας δίνουν την δυνατότητα μαζικής επεξεργασίας και αναφοράς πολλών ομοίου τύπου δεδομένων και συνήθως υλοποιούνται με τη διαδοχική δέσμευση κύριας μνήμης κατά τη διάρκεια της εκτέλεσης του προγράμματος. Η κύρια χρησιμότητα της δομής του πίνακα στις γλώσσες προγραμματισμού, είναι ότι με ένα όνομα μεταβλητής, μπορούμε να δηλώσουμε πολλές μεταβλητές στο πρόγραμμα μας. Η ιδέα αυτού τού μαζικού προσδιορισμού στοιχείων, προέρχεται από τα μαθηματικά (διανύσματα, πίνακες). Η επεξεργασία τους γίνεται εύκολα με τις εντολές επανάληψης.
Μια
μεταβλητή-πίνακας δηλώνεται όπως
μία "απλή" μεταβλητή ίδιου τύπου με
δύο αγκύλες ([, ]) μετά το όνομα της μεταβλητής
που ενδεχομένως να περιέχει τον αριθμό των
στοιχείων του πίνακα. Αν κατά την δήλωση δίνεται και η
διάσταση του πίνακα, τότε η δήλωση είναι ορισμός.
Στην C το μέλος (στοιχείο) i ενός πίνακα A[Ν] προσδιορίζεται ως A[i] και η αρίθμηση του πίνακα αρχίζει από το 0 και το τελευταίο στοιχείο του πίνακα έχει δείκτη κατά ένα λιγότερο από Ν (i=0,1,.., N-1). Δεν μπορούμε να χρησιμοποιήσουμε μεταβλητή για να δηλώσουμε το μέγεθος του πίνακα. Οι compilers της C δεν ελέγχουν αν ο δείκτης i υπερβαίνει τα όρια του πίνακα. Φυσικά είναι δυνατόν να οριστούν και πίνακες πολλαπλών διαστάσεων με στοιχεία αντίστοιχα προσδιορισμένα ως A[i][j] κ.λπ.
Συνήθως χρησιμοποιούμε εντολές επανάληψης για να δώσουμε τιμές στα στοιχεία του πίνακα ή για να τυπώσουμε ένα πίνακα και η αρχική τιμή του δείκτη i είναι 0, ενώ η συνθήκη για το τέλος του βρόγχου είναι όταν ο δείκτης γίνει κατά ένα μικρότερος από το Ν:
Διάβασμα ενός πίνακα από το πληκτρολόγιο | Εμφάνιση πίνακα στην οθόνη |
int i, digits[5]; /* μονοδιάστατος πίνακας Ν=5*/
....
for (i=0;i<5; i++) { printf("give me the no. %d element:",i); scanf("%d",&digits[i]); }
|
int i, digits[5]; /* μονοδιάστατος πίνακας Ν=5*/
.....
printf("Array: digits\n"); for (i=0;i<5; i++) printf("%d\n", digits[i]);
|
int i,j, matrix[3][4]; /*
δισδιάστατος πίνακας*/ /*M=3, N=4 */ ......
|
int i,j, matrix[3][4]; /*
δισδιάστατος πίνακας*/ /*M=3, N=4 */ .....
printf("Matrix digits:\n"); |
Οι πίνακες μπορούν να λάβουν αρχικές τιμές όταν δηλωθεί σαν κλάση μνήμης static ή extern.
Όπως έχουμε ήδη αναφέρει η συμβολοσειρά δεν τίποτε άλλο από ένας πίνακας τύπου χαρακτήρα που το τελευταίο του στοιχείο είναι ο μηδενικός χαρακτήρας (\0):
i=0;
/* εμφανίζει τα στοιχεία του πίνακα σε μορφή χαρακτήρα & αριθμού */
while (message [i]!='\0')
{
printf("%c = %d \n", message[i], message[i]);
i++;
}
Στη C οι πίνακες σχετίζονται άμεσα με τους δείκτες αφού η έκφραση p[i] είναι ίδια με την έκφραση *(p + i). Έτσι μπορεί να χρησιμοποιηθεί δυναμική μνήμη για το δυναμικό καθορισμό της διάστασης του πίνακα.
Στην προηγούμενη ενότητα |
Κ.Βασιλάκης / ΤΕΙ Κρήτης |