یونیون ها در برنامه نویسی C
در این آموزش با یونیون ها (unions) در برنامه نویسی C آشنا خواهید شد و شیوه ایجاد یونیون ها، دسترسی به اعضای آنها و تفاوت بین یونیون ها و ساختارها را یاد خواهید گرفت.
یونیون نوع تعریف شده توسط کاربر است که شبیه ساختارها در زبان C است اما یک تفاوت کلیدی دارند. ساختارها فضای کافی از حافظه را برای ذخیره همه اعضای خود اختصاص می دهد اما یونیون ها فقط به اندازه بزرگترین عضو فضا تخصیص می دهند.
تعریف یونیون
برای تعریف یونیون ها از کلمه کلیدی union استفاده می شود. مثال،
union car
{
char name[50];
int price;
};
در این کد union car یک نوع مشتق شده است.
نکته: در یونیون ها می توانید چند عضو ایجاد کنید اما در یک زمان مشخص تنها یک عضو می تواند مقدار (درست) داشته باشد.
تعریف متغیرهای union
یونیون یک نوع تعریف شده توسط کاربر است که در هنگام تعریف حافظه ای اختصاص داده نمی شود. برای تخصیص حافظه برای نوع یونیون و کار با آن باید متغیرهایی از نوع یونیون ایجاد کنید.
در کد زیر نحوه تعریف متغیرهای یونیون آورده شده است.
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 ساخته شده اند.
دسترسی به اعضای union
از عملگر . (نقطه) برای دسترسی به اعضای یونیون استفاده می شود. برای دسترسی متغیرهای اشاره گر از عملگر <– استفاده میشود.
در مثال بالا،
- برای دسترسی به price برای متغیرcar1 از car1.price استفاده شده است.
- برای دسترسی به price با car3 از (car3).price* یا car3->price استفاده می شود.
تفاوت بین یونیون ها (union) و ساختارها (structure)
برای نشان دادن تفاوت بین یونیون ها و ساختارها یک مثال می زنیم:
#include <stdio.h>
union unionJob
{
// 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(“nsize of structure = %d bytes”, sizeof(sJob));
return 0;
}
خروجی
size of union = 32
size of structure = 40
چرا اندازه متغیرهای یونیون و ساختار متفاوت است؟
در اینجا، اندازه متغیر sJob بابر با ۴۰ بایت است، چون:
- اندازه name[32] برابر با ۳۲ بایت،
- اندازه salary برابر با ۴ بایت،
- و اندازه workerNo برابر با ۴ بایت است.
اندازه uJob برابر با ۳۲ بایت است، زیرا اندازه متغیر union همیشه به اندازه بزرگترین عنصر آن خواهد بود. در مثال بالا، اندازه بزرگترین عنصر (name[32])، ۳۲ بایت است.
در یونیون همه اعضا حافظه مشابهی دارند، در واقع از یک بلوک حافظه استفاده می کنند.
مثال: دسترسی به اعضای Union
#include <stdio.h>
union Job {
float salary;
int workerNo;
} j;
int main() {
j.salary = 12.3;
// را نگه دارد ۱۲٫۳ نمی تواند مقدار j.salary ، j.workerNo با مقداردهی
j.workerNo = 100;
printf(“Salary = %.1fn”, j.salary);
printf(“Number of workers = %d”, j.workerNo);
return 0;
}
خروجی
Salary = 0.0
Number of workers = 100
زمانی که j.workerNo مقداردهی می شود، مقدار j.salary نیز تغییر می کند و در همزمان دو عضو نمی توانند مقدار داشته باشند. به دلیل اینکه هر دو متغیر union از یک بلوک مشترک در حافظه استفاده می کنند.