C++/מבנים ואיגודים

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
< C++
קפיצה לניווט קפיצה לחיפוש

מהו איגוד?[עריכה]

איגוד הוא בעצם מבנה, אשר לכל איבריו אותה הכתובת בזיכרון, מה שאומר שהשמת ערך לאחד המשתנים במבנה חלה גם על כל שאר המשתנים.

הגדרת האיגוד[עריכה]

הגדרת האיגוד מתבצעת בדומה להגדרת מבנה אלא שמילת המפתח שונה, והיא union(איגוד). גם כאן מתרחשת הגדרה של טיפוס נתונים חדש, וכל איברי הטיפוס חולקים את מקומם בזיכרון זה עם זה. הנה דוגמה להגדרת איגוד:

union untype
{
	short int num;
	char ch;
};

בדוגמה הגדרנו טיפוס נתונים חדש בצורת איגוד בשם untype בעל שני איברים, שאמורים לקבל את אותה הכתובת בזיכרון. עכשיו נצהיר על משתנה איגוד בשם un_var כך:

untype un_var;

המשתנה נראה כך בזיכרון:

    1            0
          num
-----------------------
                ch
           ------------

num הוא משתנה מטיפוס short int, ולכן גודלו 16 סיביות, והמשתנה ch הוא מטיפוס char וגודלו 8 סיביות (בית אחד). עם כך, באיגוד, ch מהווה את שמונת הסיביות הראשונות של num.

גישה לאיברי האיגוד[עריכה]

גם הגישה מתבצעת בדומה לגישה לאיברי המבנה, למשל כדי לגשת לאיבר num של המשתנה-איגוד un_var שהגדרנו קודם, נעשה כך:

un_var.num=577;

כאן הצבנו את הערך 577 לתוך האיבר num בun_var. עכשיו num נראה כך במראה סיביות:
0000001001000001
ובגלל שch הוא 8 הסיביות הראשונות של num, ערכו הוא:
01000001 ז"א 65
ולכן הערך ה-ASCII שלו הוא 'A'.

איגודים חסרי שם[עריכה]

קיים טיפוס נוסף של איגוד השונה מן האיגוד הרגיל. הוא אינו הכרזה על טיפוס חדש, אלא בעצם הודעה למהדר שאיבריו, שהם בעצם משתנים רגילים, חולקים את אותו המקום בזיכרון. לאיגוד כזה אין שם ולכן נכתב כך:

union {
short int num;
char ch;
};

בהצהרה כזו קבענו שכשישתנה ערכו של num ישתנה גם ערכו של ch, והגישה אליהם אגב היא כאל משתנים רגילים לחלוטין:

num=12;

אזי גם ערכו של ch יהיה 12.


הפרק הקודם:
מצביעים והמשתנה המיוחס
מבנים ואיגודים הפרק הבא:
זיכרון דינמי