Διάλεξη 6: Δείκτες και Πίνακες



Σχετικά έγγραφα
Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Εισαγωγή στον Προγραμματισμό

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διαδικασιακός Προγραμματισμός

Μεθόδων Επίλυσης Προβλημάτων

Ανάπτυξη και Σχεδίαση Λογισμικού

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

Δομημένος Προγραμματισμός (ΤΛ1006)

Επανάληψη για τις Τελικές εξετάσεις

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμό για ΗΜΥ

Εισαγωγή στον Προγραμματισμό

Δομημένος Προγραμματισμός (ΤΛ1006)

Διάλεξη 5: Δείκτες και Συναρτήσεις

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Δομημένος Προγραμματισμός (ΤΛ1006)

Διάλεξη 11η: Δείκτες, μέρος 1

ΕΠΛ 034: Εισαγωγή στον Προγραμματισμό για ΗΜΥ

Εισαγωγή στον δομημένο προγραμματισμό

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

9. Εντολές επανάληψηςκαι η εντολή

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός I (Θ)

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων

Μεθόδων Επίλυσης Προβλημάτων

ΕΠΛ 034: Εισαγωγή στον Προγραμματισμό για ΗΜΥ

Προγραμματισμό για ΗΜΥ

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Διαδικασιακός Προγραμματισμός

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

Εισαγωγή στον Προγραμματισμό

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Η γλώσσα προγραμματισμού C

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 3 η : Επίλυση Προβληµάτων Χειµερινό Εξάµηνο 2011

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

Διαδικασιακός Προγραμματισμός

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Κεφάλαιο : Επαναλήψεις (o βρόγχος While) (Διάλεξη 9) Δομές Έλεγχου Προγράμματος

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Δομημένος Προγραμματισμός (ΤΛ1006)

Διαδικαστικός Προγραμματισμός

Διαδικαστικός Προγραμματισμός

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Μεθόδων Επίλυσης Προβλημάτων

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Στόχοι και αντικείμενο ενότητας. Προτάσεις επανάληψης. Έλεγχος ροής προγράμματος. #5.. Εντολές Επανάληψης

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

είκτες και Πίνακες (2)

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Ανάπτυξη και Σχεδίαση Λογισμικού

Κεφάλαιο : Επαναλήψεις (oι βρόγχοιfor, do-while) (Διάλεξη 10) Εντολές Επανάληψης που θα καλυφθούν σήμερα

Ανάπτυξη και Σχεδίαση Λογισμικού

10 η Διάλεξη C++ - Πίνακες. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

Η γλώσσα προγραμματισμού C

Διαδικασιακός Προγραμματισμός

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

ΗΥ-150. Προγραμματισμός

Εισαγωγή στη γλώσσα προγραμματισμού C++

ΗΥ-150. Προγραμματισμός

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 3-2

Διάλεξη 11: Οργάνωση Προγραμμάτων σε Πολλαπλά Αρχεία

Προγραμματισμός Η/Υ (ΤΛ2007 )

Υπολογισμός - Εντολές Επανάληψης

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Μεθόδων Επίλυσης Προβλημάτων

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Κεφάλαιο : Επαναλήψεις (oι βρόχος While) ( ιάλεξη 9) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

a = 10; a = k; int a,b,c; a = b = c = 10;

5ο σετ σημειώσεων - Δείκτες

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Η γλώσσα προγραμματισμού C

Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

Transcript:

Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 6: Δείκτες και Πίνακες (Κεφάλαιο 12, KNK-2ED) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132 6-1

Περιεχόμενο Διάλεξης 6 Δείκτες & Πίνακες Αριθμητική Δεικτών (Pointer Arithmetic) Χρήση Ονόματος Πίνακα για Δείκτη (Array Name as Pointer) Χρήση Δεικτών για Επεξεργασία Πινάκων (Pointers for Array Processing) Δείκτες και Πολυδιάστατοι Πίνακες (Pointers and Multidimensional Arrays) 6-2

Αριθμητική Δεικτών (Pointers Arithmetic) Στην C υπάρχει ισχυρός δεσμός ανάμεσα στους δείκτες και στους πίνακες. Οποιαδήποτε πράξη μπορεί να γίνει με δείκτες πινάκων (π.χ., a[i]) μπορεί να γίνει και με δείκτες διευθύνσεων *pa. Έστω πίνακας int a[10]. H δήλωση αυτή ορίζει ένα μπλοκ 10 διαδοχικών αντικειμένων με ονόματα a[0], a[1],..., a[9]. Αν int *pa = NULL; τότε η ανάθεση pa = &a[0]; κάνει τον pa να δείχνει το μηδενικό στοιχείο του πίνακα. Αριθμητική δεικτών : Αν ο pa είναι δείκτης σε κάποια θέση του πίνακα, τότε οι pa i, pa++, pa-- είναι επίσης δείκτες pa + 1, pa++ δείκτης στο επόμενο στοιχείο του πίνακα από αυτό που δείχνει ο pa. pa + i, (pa i) δείκτης στο σημείο του πίνακα που βρίσκεται i pa θέσεις μετά (πριν) από αυτό που δείχνει ο pa. 6-3

Αριθμητική Δεικτών (Παράδειγμα 1) Παράδειγμα πρόσθεσης δεικτών: p = &a[2]; q = p + 3; p += 6; 6-4

Αριθμητική Δεικτών (Pointers Arithmetic) Έτσι, αν pa = &a[0], τότε για παράδειγμα, pa + 2 δείχνει στη τρίτη θέση του πίνακα, δηλ. στο a[2]. *(pa + 2) έχει την τιμή της 3ης θέσης του πίνακα, δηλ. το a[2]. Έξ ορισμού, η τιμή μιας μεταβλητής τύπου πίνακα (int a[]) είναι η διεύθυνση του μηδενικού στοιχείου του πίνακα. Επομένως αντί pa = &a[0] μπορούμε να γράψουμε pa = a. Tότε οι pa και a έχουν τις ίδιες τιμές και μπορούν να χρησιμοποιούνται η μια στη θέση της άλλης: Το a[i] είναι ταυτόσημο με τα *(pa +i) ή *(a + i) ή pa[i]. To &a[i] είναι ταυτόσημο με τα a+i, pa+i. Ωστόσο pa και a ΔΕΝ είναι ταυτόσημα (sizeof(pa) <> sizeof(a)) π.χ., int a[10]; int *pa = NULL; sizeof(pa) = 4 bytes (ILP32) ή 8 bytes (LP64) sizeof(a) = μέγεθος πίνακα * μέγεθος τύπου Επίσης, δεν μπορώ να μεταβάλω ένα πίνακα (π.χ., a++, a=pa) EPL132: Δες παράδειγμα Programming στην Principles επόμενη II - διαφάνεια. Demetris Zeinalipour (University of Cyprus) 6-5

Αριθμητική Δεικτών (Παράδειγμα 2) Προσοχή: ο δείκτης είναι μεταβλητή και έτσι pa = a και pa++ είναι έγκυρες εκφράσεις. Το όνομα ενός πίνακα όμως δεν είναι μεταβλητή, επομένως κατασκευές όπως a = pa και a++ δεν είναι έγκυρες! Ποιες από τις πιο κάτω εντολές είναι έγκυρες; int t[10] = {0, i = 5, *p = NULL; p = t; p[2] = 3; // ίδιο με *(p+2) = 3 ++p; *p = 14; *(t+i) = 33; // ίδιο με t[i] = 33 ++t; => compile error value 0 14 3 0 0 33 0 0 0 0 index t[0] t[1] t[2] t[3] t[4] t[5] t[6] t[7] t[8] t[9] 6-6

Σύγκριση Δεικτών (Comparing Pointers) Για τη σύγκριση δεικτών μπορούν να χρησιμοποιηθούν όλοι οι γνωστοί σχεσιακοί τελεστές (<, <=, >, >=) και οι τελεστές ισότητας (== and!=). Ουσιαστικά συγκρίνονται διευθύνσεις μνήμης (θυμηθείτε ότι κάθε διεύθυνση αναφέρεται σε ένα byte μνήμης) Η χρήση των σχεσιακών τελεστών έχει νόημα ΜΟΝΟ για δείκτες σε αντικείμενα του ίδιου πίνακα τα οποία βρίσκονται σε συνεχόμενες διευθύνσεις μνήμης (άλλες μεταβλητές μπορεί να βρίσκονται σε αυθαίρετες άλλες διευθύνσεις), Παράδειγμα: το αποτέλεσμα της σύγκρισης εξαρτάται από την απόσταση δυο στοιχείων στον πίνακα., π.χ., p = &a[5]; q = &a[1]; (p >= q) => TRUE (1) (p <= q) => FALSE (0) 6-7

Αριθμητική Δεικτών & Πίνακες (Παράδειγμα 3) Τι κάνει το ακόλουθο πρόγραμμα; #define N 10 int a[n], sum, *p = NULL; sum = 0; for (p = &a[0]; p < &a[n]; p++) sum += *p; ή (το αντίστοιχο) for (p = a; p < a + N; p++) sum += *p; Μετά την πρώτη επανάληψη To p++ προχωρεί 4 bytes (int) σε κάθε κλήση! 6-8

Παράδειγμα (1-d Πίνακες + Αριθμητική Δεικτών) /* Πρόγραμμα αντιστροφής αριθμών με αριθμητική δεικτών */ #include <stdio.h> #define N 10 int main(void) { int a[n], *p = NULL; For loop με αριθμητική δεικτών printf("enter %d numbers: ", N); for (p = a; p < a + N; p++) scanf("%d", p); // το p είναι δείκτης άρα δεν θέλει & printf("in reverse order:"); for (p = a + N - 1; p >= a; p--) printf(" %d", *p); printf("\n"); return 0; 6-9

Συνδυασμός Τελεστών (* και ++) Οι προγραμματιστές C συχνά συνδυάζουν τους τελεστές * (έμμεσης αναφοράς) and ++ (αύξησης). Παράδειγμα Μια πρόταση η οποία αναθέτει το 5 στη θέση a[i] και στη συνέχεια αυξάνει το i κατά 1: a[i++] = 5; // a[++i] = 5; Πρώτα αύξηση, μετά ανάθεση H αντίστοιχη έκδοση με δείκτες: *p++ = 5; // Να αποφεύγονται εκφράσεις χωρίς παρενθέσεις H επιθεματική (postfix) έκδοση της ++ έχει μεγαλύτερη προτεραιότητα από το *, οπότε ο μεταγλωττιστής το βλέπει ως: *(p++) = 5; // Ισοδύναμο με *p = 5; p++; 6-10

Συνδυασμός Τελεστών (* και ++) Πιθανοί συνδυασμοί των * και ++ A= Χρησιμοποιείται ΠΑΝΤΑ παρενθέσεις για να αποφύγετε τον πονοκέφαλο των προτεραιοτήτων Έκφραση *(p++) *(++p) (*p)++ ++(*p) Εκτός Έκφρασης p++; Ίδιο με ++p; Νόημα η τιμή της μεταβλητής Α είναι *p πριν την μετακίνηση. στη συνέχεια προχωρεί το p προχώρησε το p πρώτα. η τιμή της μεταβλητής Α είναι *p μετά την μετακίνηση η τιμή της μεταβλητής Α είναι *p πριν την αύξηση. στη συνέχεια αυξάνεται το *p αύξησε το *p πρώτα. η τιμή της μεταβλητής Α είναι *p μετά την αύξηση Στα Πλαίσια Έκφρασης (Ανάθεσης) p2 = p++; Διαφορετικό από p2 = ++p; 6-12

Πίνακες Συναρτήσεις - Δείκτες int find_largest(int a[], int n) { int i, max; max = a[0]; for (i = 1; i < n; i++) if (a[i] > max) max = a[i]; return max; largest = find_largest(a, N); Παράδειγμα: Κλήση Συνάρτησης: Εναλλακτικό Πρότυπο με Δείκτες: int find_largest(int *a, int n) Προστασία Στοιχείων Πίνακα (το a προστατεύεται έτσι και αλλιώς εφόσον έχει τοπική ορατότητα - εμβέλεια, δείτε διαφάνεια 5.30) int find_largest(const int a[], int n) ή int find_largest(const int *a, int n) H find_largest εκτελείται από το a[2] στοιχείo: find_largest(&a[2], N-2); 6-13

Δείκτες και Πολυδιάστατοι Πίνακες (Διαχείριση Γραμμών) Παρόμοιο με τους 1-d πίνακες (arrays), έτσι και στους M- d πίνακες (matrices), οι δείκτες μπορούν να χρησιμοποιηθούν για να δείχνουν σε στοιχεία των πινάκων. Π.χ., μηδενισμός θέσεων πίνακα int a[row][col], *p = ΝULL, i; for (p = &a[0][0]; p <= &a[row-1][col-1]; p++) *p = 0; // διαχείριση στοιχείων με δείκτες 6-14

#define ROW 5 #define COL 5 int sum_two_dimensional_array(const int [][COL]); int sum_two_dimensional_array(const int a[][col]) { int i, j, sum = 0; for(i=0; i<row; i++) for (j=0; j<col; j++) sum+=a[i][j]; return sum; Παράδειγμα (m-d Πίνακες + Συναρτήσεις + Δείκτες) Aς δούμε 4 διαφορετικές παραλλαγές υλοποίησης της sum() των στοιχείων ενός 2D πίνακα Λύση 1: Mε defined ROW + COL (λογική που έχουμε χρησιμοποιήσει εκτενώς στο παρελθόν) int main() { const int a[][col] = { {1,1,1,1,1, {2,2,2,2,2, {3,3,3,3,3, {4,4,4,4,4, {5,5,5,5,5 ; // sum = 75 (5x15) printf("sum:%d\n", sum_two_dimensional_array(a)); return 0; 6-15

#define COL 5 int sum_two_dimensional_array(const int [][COL], int); int sum_two_dimensional_array(const int a[][col], int ROW) { int i, j, sum = 0; for(i=0; i<row; i++) for (j=0; j<col; j++) sum+=a[i][j]; return sum; Παράδειγμα (m-d Πίνακες + Συναρτήσεις + Δείκτες) Λύση 2: Με COL, Χωρίς define ROW Αριθμός στοιχείων γραμμής int main() { int sum = 0; const int a[][col] = { {1,1,1,1,1, {2,2,2,2,2, {3,3,3,3,3, {4,4,4,4,4, {5,5,5,5,5 ; // sum = 75 (5x15) sum = sum_two_dimensional_array(a, sizeof(a[0])/sizeof(a[0][0])); return 0; Μέγεθος (bytes) Μέγεθος (bytes) EPL132: Programming Principles II - Demetris γραμμής Zeinalipour πίνακα (University στοιχείων πίνακα of Cyprus) 6-16

Δείκτες και Πολυδιάστατοι Πίνακες (Διαχείριση Στηλών) Επεξεργασία στηλών είναι κάπως πιο περίπλοκη εφόσον οι πίνακες αποθηκ. ανά γραμμή (όχι ανά στήλη). Παράδειγμα: Ένα loop που αναθέτει την τιμή 0 στην στήλη i του πίνακα a: ή int a[row][col], (*p)[col] = NULL, i=2; // Διεύθυνση γραμμής 0 for (p = &a[0]; p < &a[row]; p++) (*p)[i] = 0; // το p++ προχωρεί COL θέσεις!!!! for (p = a; p < a + ROWS; p++) (*p)[i] = 0; Δείκτης σε ένα ROW (πλάτους COL) Το (*p)[i] χρειάζεται παρενθέσεις εφόσον η προτεραιότητα του [] είναι ψηλότερη από αυτή του *. Εναλλακτικά θα ήταν πίνακας δεικτών που θα δούμε αργότερα Ακολουθεί παράδειγμα χρήσης του (*p)[i] 6-17

Δείκτες και Πολυδιάστατοι Πίνακες (Διαχείριση Στηλών) int main() // Πρόγραμμα Μηδενισμού Στήλης με Δείκτης { int sum = 0; int a[][col] = { {1,1,1,1,1, {2,2,2,2,2, {3,3,3,3,3, {4,4,4,4,4, {5,5,5,5,5 ; // sum = 75 (5x15) int (*p)[col] = NULL; // δείκτης σε ROW (πλάτους COL) int ROW = sizeof(a[0])/sizeof(a[0][0]); Μέγεθος (bytes) γραμμής πίνακα int i = 2; // column to change for (p = &a[0]; p < &a[row]; p++) (*p)[i] = 0; Μέγεθος (bytes) στοιχείων πίνακα print_two_dimensional_array(a, ROW); return 0; INPUT Αριθμός στοιχείων γραμμής το p++ προχωρεί COL θέσεις OUTPUT 6-18

#define COL 5 void sum_two_dimensional_array(const int (*)[COL], int); int sum_two_dimensional_array(const int (*a)[col], int ROW) { int i, j, sum = 0; for(i=0; i<row; i++) for (j=0; j<col; j++) a sum+=a[i][j]; return sum; int main() {... sum = sum_two_dimensional_array(a, sizeof(a[0])/sizeof(a[0][0]));... Παράδειγμα (m-d Πίνακες + Συναρτήσεις + Δείκτες) Ενδιάμεση Λύση: Ίδιο με Προηγούμενο αλλά με Δείκτη σε Γραμμή στο πρότυπο Ίδια κλήση με προηγούμενο παράδειγμα 6-20

Παράδειγμα (m-d Πίνακες + Συναρτήσεις + Δείκτες) Λύση 3: Δείκτη σε Γραμμή + Απαριθμητό βρόχο #define COL 5... int sum_two_dimensional_array(int (*a)[col], int ROW) { int i, sum = 0; int *pa = &a[0][0]; // πρώτο στοιχείο πίνακα for(i=0; i < ROW*COL; i++) { sum += *pa; pa++; return sum; a int main() {... sum = sum_two_dimensional_array(a, sizeof(a[0])/sizeof(a[0][0]));... 6-21

Επισκόπηση: Πίνακες Δεικτών Σε όλα τα προηγούμενα παραδείγματα το COL ήταν προσδιορισμένο ως σταθερά. Τι γίνεται εάν ΔΕΝ γνωρίζουμε το COL εκ των πρότερων; Τότε μπορούμε να χρησιμοποιήσουμε Πίνακες Δεικτών (που υλοποιούνται με Δείκτες σε Δείκτες **p) και τους οποίους θα δούμε στην ερχόμενη διάλεξη 7. Δεξιά: Παράδειγμα Πίνακα Δεικτών σε Μήνες (κάθε COL έχει διαφορετικό πλάτος) 6-23