Γ ενώσεις (με παραδείγματα)

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

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

Πώς να ορίσετε μια ένωση;

Χρησιμοποιούμε τη unionλέξη-κλειδί για να ορίσουμε συνδικάτα. Ακολουθεί ένα παράδειγμα:

 union car ( char name(50); int price; ); 

Ο παραπάνω κώδικας ορίζει έναν παράγωγο τύπο union car.

Δημιουργία μεταβλητών ένωσης

Όταν ορίζεται μια ένωση, δημιουργεί έναν καθορισμένο από τον χρήστη τύπο. Ωστόσο, δεν έχει εκχωρηθεί μνήμη. Για να εκχωρήσουμε μνήμη για έναν δεδομένο τύπο ένωσης και να εργαστούμε μαζί του, πρέπει να δημιουργήσουμε μεταβλητές.

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

 union car ( char name(50); int price; ); int main() ( union car car1, car2, *car3; return 0; ) 

Ένας άλλος τρόπος δημιουργίας μεταβλητών ένωσης είναι:

 union car ( char name(50); int price; ) car1, car2, *car3; 

Και στις δύο περιπτώσεις, δημιουργούνται μεταβλητές συνδικάτου car1, car2 και συνθέτης car3 union carτύπου 3.

Πρόσβαση σε μέλη μιας ένωσης

Χρησιμοποιούμε τον .χειριστή για πρόσβαση σε μέλη μιας ένωσης. Για πρόσβαση στις μεταβλητές δείκτη, χρησιμοποιούμε επίσης τον ->τελεστή.

Στο παραπάνω παράδειγμα,

  • Για πρόσβαση στην τιμή car1, car1.priceχρησιμοποιείται.
  • Για την τιμή πρόσβασης που χρησιμοποιούν car3, είτε (*car3).priceή car3->priceμπορεί να χρησιμοποιηθεί.

Διαφορά μεταξύ συνδικάτων και δομών

Ας πάρουμε ένα παράδειγμα για να δείξουμε τη διαφορά μεταξύ συνδικάτων και δομών:

 #include union unionJob ( //defining a union char name(32); float salary; int workerNo; ) uJob; struct structJob ( char name(32); float salary; int workerNo; ) sJob; int main() ( printf("size of union = %d bytes", sizeof(uJob)); printf("size of structure = %d bytes", sizeof(sJob)); return 0; ) 

Παραγωγή

 μέγεθος ένωσης = 32 μέγεθος δομής = 40 

Γιατί αυτή η διαφορά στο μέγεθος των μεταβλητών ένωσης και δομής;

Εδώ, το μέγεθος του sJob είναι 40 bytes επειδή

  • το μέγεθος name(32)είναι 32 byte
  • το μέγεθος salaryείναι 4 byte
  • το μέγεθος workerNoείναι 4 byte

Ωστόσο, το μέγεθος του uJob είναι 32 byte. Είναι επειδή το μέγεθος μιας μεταβλητής ένωσης θα είναι πάντα το μέγεθος του μεγαλύτερου στοιχείου της. Στο παραπάνω παράδειγμα, το μέγεθος του μεγαλύτερου στοιχείου του, ( name(32)), είναι 32 byte.

Με μια ένωση, όλα τα μέλη μοιράζονται την ίδια μνήμη .

Παράδειγμα: Πρόσβαση σε μέλη της Ένωσης

 #include union Job ( float salary; int workerNo; ) j; int main() ( j.salary = 12.3; // when j.workerNo is assigned a value, // j.salary will no longer hold 12.3 j.workerNo = 100; printf("Salary = %.1f", j.salary); printf("Number of workers = %d", j.workerNo); return 0; )

Παραγωγή

 Μισθός = 0,0 Αριθμός εργαζομένων = 100 

Για να μάθετε πού χρησιμοποιούνται τα συνδικάτα, επισκεφθείτε Γιατί χρειαζόμαστε τα C Union;

ενδιαφέροντα άρθρα...