Οι δομές (structs) στην C είναι ένας τρόπος για να ομαδοποιούνται πολλές σχετικές μεταβλητές σε ένα σημείο. Κάθε μεταβλητή στη δομή είναι γνωστή ως μέλος της δομής.
Αντίθετα από έναν πίνακα, μια δομή μπορεί να περιέχει πολλούς διαφορετικούς τύπους δεδομένων (int, float, char, κλπ.).
Η δομή ορίζεται ως εξής:
struct student { char name[50]; int age; float gpa; };
Η παραπάνω δομή ορίζει ένα νέο τύπο δεδομένων που ονομάζεται “student”. Ένα αντικείμενο της δομής “student” θα περιέχει τα μέλη “name”, “age” και “gpa”. Μπορούμε να δημιουργήσουμε ένα αντικείμενο της δομής “student” ως εξής:
struct student s1;
Για να προσπελάσουμε ένα μέλος της δομής, χρησιμοποιούμε τον τελεστή “.” (τελεία):
s1.age = 20; printf("The age of the student is %d\n", s1.age);
Στο παραπάνω παράδειγμα, έχουμε ορίσει το μέλος “age” του αντικειμένου “s1” ως 20, και έπειτα το εκτυπώνουμε.
Μπορούμε επίσης να αρχικοποιήσουμε μια δομή κατά τη δήλωσή της:
struct student s2 = {"John", 18, 3.5};
Αυτό θα δημιουργήσει ένα αντικείμενο της δομής “student” με τα μέλη του να έχουν τις αντίστοιχες τιμές.
[adinserter block=”2″]
Μπορούμε να δηλώσουμε έναν δείκτη προς μια δομή με την ίδια σύνταξη όπως οι δείκτες προς άλλους τύπους δεδομένων:
struct student *ptr;
Για να αναφερθούμε στο μέλος μιας δομής μέσω ενός δείκτη προς αυτήν τη δομή, χρησιμοποιούμε τον τελεστή “->” (βέλος):
ptr->age = 22; printf("The age of the student is %d\n", ptr->age);
Στο παραπάνω παράδειγμα, έχουμε ορίσει το μέλος “age” του αντικειμένου στο οποίο δείχνει ο δείκτης “ptr” ως 22, και έπειτα το εκτυπώνουμε.
Η δομή μπορεί επίσης να χρησιμοποιηθεί ως παράμετρος σε μια συνάρτηση ή να επιστραφεί από αυτήν:
struct student create_student(char name[], int age, float gpa) { struct student s; strcpy(s.name, name); s.age = age; s.gpa = gpa; return s; }
Στο παραπάνω παράδειγμα, δημιουργούμε μια νέα δομή “student” με τα μέλη που δίνονται σαν παράμετροι, τοποθετούμε αυτά τα μέλη στο αντικείμενο, και επιστρέφουμε τη δομή.
Μπορούμε να δημιουργήσουμε μια δομή (struct) χρησιμοποιώντας τη λέξη-κλειδί struct
και δηλώνοντας τα μέλη της εντός αγκυλών από πίσω:
struct student { char name[50]; int age; float gpa; };
Στο παραπάνω παράδειγμα δημιουργούμε μια δομή “student” η οποία έχει τρία μέλη: το όνομα (αλφαριθμητικό με μέγιστο μήκος 50 χαρακτήρες), την ηλικία (ακέραιος αριθμός) και το βαθμό (πραγματικός αριθμός).
Μπορούμε να δημιουργήσουμε μια νέα δομή “student” χρησιμοποιώντας την παραπάνω δήλωση ως εξής:
struct student s;
Αυτό θα δημιουργήσει ένα νέο αντικείμενο τύπου “student” με τα μέλη του να έχουν αυθαίρετες τιμές.
Για να έχουμε πρόσβαση στα μέλη της δομής, πρέπει να δημιουργήσουμε μια μεταβλητή τύπου δομής.
Χρησιμοποιούμε τη λέξη-κλειδί struct
μέσα στη συνάρτηση main()
και ακολουθούμε με το όνομα της δομής και την όνομασία της μεταβλητής τύπου δομής:
int main() { struct student s; s.age = 22; strcpy(s.name, "John"); s.gpa = 3.5; printf("Name: %s\n", s.name); printf("Age: %d\n", s.age); printf("GPA: %f\n", s.gpa); return 0; }
Στο παραπάνω παράδειγμα, έχουμε δημιουργήσει μια μεταβλητή “s” τύπου δομής “student” και έχουμε ορίσει τα μέλη της δομής μέσω αυτής της μεταβλητής. Έπειτα, τα εκτυπώνουμε με τη χρήση της συνάρτησης printf().
[adinserter block=”3″]
Για να έχουμε πρόσβαση στα μέλη μιας δομής, χρησιμοποιούμε τη σύνταξη με την τελεία (.).
Για παράδειγμα, για να ανατρέξουμε στο μέλος name της δομής “student” που ονομάζεται s, χρησιμοποιούμε την εντολή:
printf("Name: %s\n", s.name);
Ομοίως, για τα μέλη age και gpa, χρησιμοποιούμε την εντολή:
printf("Age: %d\n", s.age); printf("GPA: %f\n", s.gpa);
Τώρα μπορείτε εύκολα να δημιουργήσετε πολλαπλές μεταβλητές δομής με διαφορετικές τιμές, χρησιμοποιώντας μόνο μία δομή:
int main() { struct student s1; s1.age = 22; strcpy(s1.name, "John"); s1.gpa = 3.5; struct student s2; s2.age = 20; strcpy(s2.name, "Jane"); s2.gpa = 3.8; printf("Student 1:\n"); printf("Name: %s\n", s1.name); printf("Age: %d\n", s1.age); printf("GPA: %f\n", s1.gpa); printf("\nStudent 2:\n"); printf("Name: %s\n", s2.name); printf("Age: %d\n", s2.age); printf("GPA: %f\n", s2.gpa); return 0; }
Στο παραπάνω παράδειγμα, έχουμε δημιουργήσει δύο διαφορετικές μεταβλητές δομής “student” με τις δικές τους τιμές και τις εκτυπώνουμε.
Να θυμάστε ότι οι συμβολοσειρές στο C είναι στην πραγματικότητα ένας πίνακας από χαρακτήρες, και δυστυχώς δεν μπορείτε να αναθέσετε μια τιμή σε έναν πίνακα με αυτόν τον τρόπο:
struct student { int age; char name[50]; float gpa; }; struct student s; s.name = "John"; // This is invalid!
Για να αντιγράψετε μια συμβολοσειρά σε ένα μέλος της δομής, πρέπει να χρησιμοποιήσετε τη συνάρτηση strcpy() από τη βιβλιοθήκη string.h:
struct student { int age; char name[50]; float gpa; }; struct student s; s.age = 22; strcpy(s.name, "John"); s.gpa = 3.5;
Στο παραπάνω παράδειγμα, αναθέτουμε τη συμβολοσειρά “John” στο μέλος name της δομής s χρησιμοποιώντας τη συνάρτηση strcpy().
Μπορείτε επίσης να αναθέσετε τιμές στα μέλη ενός αντικειμένου δομής κατά τη δήλωσή τους, σε μία μόνο γραμμή.
Απλά εισάγετε τις τιμές σε μια λίστα χωρισμένη με κόμματα μέσα σε αγκύλες {}. Να σημειώσουμε ότι με αυτήν την τεχνική δεν χρειάζεται να χρησιμοποιήσετε τη συνάρτηση strcpy() για συμβολοσειρές:
struct student { int age; char name[50]; float gpa; }; struct student s = {22, "John", 3.5};
Στο παραπάνω παράδειγμα, δηλώνουμε ένα αντικείμενο δομής s τύπου “student”, και αναθέτουμε τις τιμές 22, “John” και 3.5 στα μέλη age, name και gpa αντίστοιχα, χρησιμοποιώντας μια γραμμή κώδικα.
[adinserter block=”4″]
Μπορείτε επίσης να αντιγράψετε μια δομή σε μια άλλη.
Στο παρακάτω παράδειγμα, οι τιμές της s1 αντιγράφονται στην s2:
struct student { int age; char name[50]; float gpa; }; struct student s1 = {22, "John", 3.5}; struct student s2; s2 = s1;
Στο παραπάνω παράδειγμα, οι τιμές των μελών age, name και gpa της s1 αντιγράφονται στα αντίστοιχα μέλη της s2.
Αν θέλετε να αλλάξετε / τροποποιήσετε μια τιμή, μπορείτε να χρησιμοποιήσετε τη σύνταξη με την τελεία (.).
Και για να τροποποιήσετε μια τιμή συμβολοσειράς, η συνάρτηση strcpy() είναι και πάλι χρήσιμη:
struct student { int age; char name[50]; float gpa; }; struct student s = {22, "John", 3.5}; s.age = 23; strcpy(s.name, "Mary"); s.gpa = 4.0;
Στο παραπάνω παράδειγμα, αλλάζουμε την ηλικία του s από 22 σε 23, το όνομα από “John” σε “Mary”, και το gpa από 3.5 σε 4.0.
Η τροποποίηση τιμών είναι ιδιαίτερα χρήσιμη όταν αντιγράφετε τιμές δομών:
struct student { int age; char name[50]; float gpa; }; struct student s1 = {22, "John", 3.5}; struct student s2; s2 = s1; s2.age = 23; strcpy(s2.name, "Mary"); s2.gpa = 4.0;
Στο παραπάνω παράδειγμα, αντιγράφουμε τις τιμές των μελών της s1 στην s2 και, στη συνέχεια, τροποποιούμε τις τιμές της s2, χωρίς να επηρεάζουμε τις τιμές της s1.
Μια χρήσιμη εφαρμογή των δομών είναι να χρησιμοποιούνται για να αποθηκεύουν διαφορετικές πληροφορίες σχετικά με ένα συγκεκριμένο αντικείμενο.
Για παράδειγμα, μπορούμε να χρησιμοποιήσουμε μια δομή για να αποθηκεύουμε διαφορετικές πληροφορίες σχετικά με έναν επεξεργαστή (CPU):
struct cpu { char brand[20]; char model[20]; int cores; float frequency; }; struct cpu my_cpu = {"Intel", "i7", 8, 2.6};
Στο παραπάνω παράδειγμα, η δομή cpu περιέχει τέσσερα μέλη, τα οποία αντιπροσωπεύουν τον κατασκευαστή, το μοντέλο, τον αριθμό των πυρήνων και τη συχνότητα του επεξεργαστή.
Στη συνέχεια, δημιουργούμε μια μεταβλητή my_cpu τύπου cpu και εκχωρούμε τις τιμές των μελών της δομής σε αυτήν.