Οι πίνακες στην C

Ο πίνακας  ειναι μια αρκετα διαδεδομένη δομη στοιχείων (data, δεδομενα)  και μπορει να  καθοριστεί σε καθε  σχεδον γλωσσα προγραμματισμού. Οι πίνακες μας δίνουν την δυνατότητα μαζικής αναφοράς σε πολλά ομοίου τύπου δεδομένα και συνήθως υλοποιούνται με τη διαδοχική φύλαξη των στοιχείων τους στη μνήμη. Η  κυρια χρησιμοτητα  της δομής του πίνακα στις γλώσσες προγραμματισμού, είναι ότι με ένα όνομα μεταβλητής, μπορουμε να καθορισουμε πολλλές  μεταβλητές στο πρόγραμμα μας. Η ιδεα αυτού τού  μαζικού προσδιορισμού στοιχείων, προερχεται  απο τα μαθηματικά (διάνυσματα, πίνακες).

Μια μεταβλητή-πίνακας δηλώνεται όπως μία "απλή" μεταβλητή ίδιου τύπου με δύο αγκύλες ([, ]) μετά το όνομα της μεταβλητής που ενδεχομένως να περιέχει τον αριθμό των στοιχείων του πίνακα. Αν κατά την δήλωση δίνεται και η διάσταση του πίνακα, τότε η δήλωση είναι ορισμός.


char  table[15];   /* πίνακας 15 χαρακτήρων - συμβολοσειρά */ 

int digits[10];    /* μονοδιάστατος πίνακας 10 ακεραίων */ 

int grid[3][3];   /* δισδιάστατος πίνακας  3x3 ακεραίων */
 

 

Στην 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 */

......


for (i=0;i<3; i++)
   for (j=0;j<4; j++)
      {
            printf("give me the no. %d,%d element:", i,j);
            scanf("%d",&matrix[i][j]); 
       } 

int i,j, matrix[3][4]; /* δισδιάστατος πίνακας*/
                                  /*M=3, N=4 */

.....

 

printf("Matrix digits:\n");
for (i=0;i<3; i++)
   {
      for (j=0;j<4;j++)
            printf("%5d ", matrix[i][j]);
      printf("\n"); /*γιατί; */
}

 

Οι πίνακες μπορούν να λάβουν αρχικές τιμές όταν δηλωθεί σαν κλάση μνήμης static ή extern

Οπως έχουμε ήδη αναφέρει η συμβολοσειρά δεν τιποτε άλλο από ένας πίνακας τύπου χαρακτήρα που το τελευταίο του στοιχείο είναι ο μηδένικός χαρακτήρας (\0):

i=0;

/* εμφανίζει τα στοιχεία του πίνακα σε μορφή χαρακτήρα & αριθμού */

while (message [i]!='\0')

  { 

        printf("%c = %d \n", message[i], message[i]);

        i++;

  }

 

 

Στη C οι πίνακες σχετίζονται άμεσα με τους δείκτες αφού η έκφραση p[i] είναι ίδια με την έκφραση *(p + i).  Έτσι μπορεί να χρησιμοποιηθεί δυναμική μνήμη για το δυναμικό καθορισμό της διάστασης του πίνακα.
 
Στην προηγούμενη ενότητα

Στην αρχική σελίδα

Στην επόμενη ενότητα

Κ.Βασιλάκης / ΤΕΙ Κρήτης