Η έννοια της δομής δεδομένων και η εντολή typedef

Η έννοια της δομής δεδομένων

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

struct     structname{
      tape1   member1;
      tape2    member2;
     . . .
};

Το όνομα της δομής structname είναι προερετικό. Στη δήλωση της δομής η δεξιά αγκύλη που τερματίζει την λίστα των μελών της δομής μπορεί να ακολουθείται από μια λίστα μεταβλητών της δομής δεδομένων όπως σε κάθε βασικό τύπο. Το ακόλουθο παράδειγμα αναφέρεται σε μια κάρτα καταλόγου μιας βιβλιοθήκης.

struct  catalog{
       char  author[40];
       char  title[40];
        char pub[40];
        unsigned int date;
        unsigned int rev;
}card;

Εδώ η card δηλώνεται ως μια μεταβλητή της δομής catalog. Θα μπορούσαμε να δηλώσουμε και άλλες μεταβλητές της δομής, εισάγωντας τες στο τέλος με διαχωριστικό τον τελεστή κόμμα.

Μετά τη δήλωση της δομής του παραπάνω παραδείγματος, θα μπορούσαμε να δηλώσουμε μια νέα μεταβλητή δομής ως εξής:

struct catalog newcard;

Η δήλωση μιας δομής η οποία δεν ακολουθείται από ορισμό μεταβλητών δεν δεσμεύει μνήμη για αποθήκευση δεδομένων.

Ένα άλλο παράδειγμα δομής είναι η δήλωση μιας δομής δεδομένων που ορίζει ένα σημείο στο επίπεδο.

struct  point {
       int x;
       int y;
};

Τώρα μπορούμε να δηλώσουμε ένα σημείο pt στο επίπεδο ως εξής:

struct  point  pt;

Για να προσπελάσουμε αυτή τη μεταβλητή που ορίζει το σημείο και να της δώσουμε τιμές, χρησιμοποιούμε τον τελεστή τελεία ως εξής:

pt.x = 10;
pt.y = 20;

δηλαδή το σημείο pt έχει συντεταγμένες (10, 20). Θα μπορούσαμε να δηλώσουμε το υπόδειγμα pt2 της δομής point, με άμεσο ορισμό των συντεταγμένων του ως εξής:

struct point {
     int x;
     int y;
} pt2 = {80, 90};

Κάνοντας χρήση του παραπάνω παραδείγματος μπορούμε να υπολογίσουμε το τετράγωνο της απόστασης του σημείου pt2 από την αρχή των αξόνων ως εξής:
sq_distance = pt2.x * pt2.x + pt2.y * pt2.y;

Μπορούμε να σχηματίζουμε φωλιασμένες δομές, έτσι μια δομή δεδομένων να έχει σαν μέλος μια άλλη δομή. Σαν παράδειγμα παίρνουμε τον ορισμό ενός κύκλου που να ορίζεται από το κέντρο του και την ακτίνα του. Ως συνέχεια του προηγούμενου παραδείγματος, έχουμε:

struct  circle{
       struct  point  center;
       unsigned int  radius;
};

Μπορούμε να έχουμε πίνακες που τα στοιχεία τους να είναι δομές δεδομένων. Σαν συνέχεια του παραπάνω παραδείγματος μπορούμε να ορίσουμε ένα πίνακα με τρία στοιχεία, τις κορυφές ενός τριγώνου, που να περιγράφονται από τη δομή δεδομένων point, ως εξής:

struct  point  triangle[3];

Όπου κάθε κορυφή του τριγώνου ορίζεται ως εξής:

triangle[0].x  =  0;
triangle[0].y = 0;
triangle[1].x = 10;
triangle[1].y = 0;
triangle[2].x = 5;
triangle[2].y = 10;

Η εντολή typedef

Η γλώσσα C παρέχει την δυνατότητα να εκχωρούμε εναλλακτικά ονόματα σε ένα τύπο δεδομένων. Αυτό μπορεί να γίνει με την εντολή γνωστή ως typedef. Για παράδειγμα η εντολή:

typedef int Counter;

ορίζει το όνομα Counter σαν ισοδύναμο του τύπου δεδομένων int  (ακέραιος) της C. Μεταβλητές μπορούν να δηλωθούν να είναι του τύπου Counter, όπως στην επόμενη εντολή:

Counter j, n;

O C compiler μεταχειρίζεται τις δηλώσεις των μεταβλητών j και n της προηγούμενης δήλωσης σαν να είναι κανονικές ακέραιες μεταβλητές. Από την δήλωση των μεταβλητών j και n τύπου Counter, φαίνεται ο σκοπός τους μέσα στο πρόγραμμα. Δηλώνοντας αυτές τις μεταβλητές σαν τον παραδοσιακό τύπο int δεν γίνεται σαφές για πιο σκοπό χρησιμοποιούνται. Επίσης εκλέγοντας ονόματα περισσότερο περιγραφικά θα μπορούσαμε να βοηθηθούμε με άλλο τρόπο.

Η επόμενη εντολή typedef δηλώνει το όνομα StringPtr ως ένας δείκτης σε χαρακτήρα:

typedef char  *StringPtr

Μεταβλητές μπορούν να δηλωθούν με τύπο StringPtr, όπως:

StringPtr  buffer1,  buffer2;

Όπου ο compiler τις μεταχειρίζεται σαν δείκτες σε χαρακτήρα.

Στο επόμενο παράδειγμα ορίζεται ένας νέος τύπος με όνομα Date να είναι μια δομή, η οποία περιέχει τρεις ακέραιους αριθμούς με ονόματα month, day και year.

typedef struct{
   int month;
   int day;
   int year;
} Date;

Με αυτό τον ορισμό typedef μπορούμε να δηλώσουμε μεταβλητές τύπου Date, όπως τον πίνακα:

Date  birthdays[100];

Ο οποίος περιέχει 100 στοιχεία του τύπου δομής Date.