Σε αυτό το σεμινάριο, θα μάθετε για τα συνδικάτα στον προγραμματισμό Γ. Πιο συγκεκριμένα, πώς να δημιουργήσετε συνδικάτα, να αποκτήσετε πρόσβαση στα μέλη της και να μάθετε τις διαφορές μεταξύ συνδικάτων και δομών.
Η ένωση είναι ένας καθορισμένος από τον χρήστη τύπος παρόμοιος με τις δομές στο 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;