לדלג לתוכן

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 סיביות (בית אחד). אם כן, באיגוד untype שרשום למעלה ch מהווה את שמונה הסיביות הראשונות של num.

גישה לאיברי האיגוד

[עריכה]

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

un_var.num=577;

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

איגודים חסרי שם

[עריכה]

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

union {
short int num;
char ch;
};

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

num=12;

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


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