C'de Birlikler (Union) #C9


Birlikler, aynı bellek anını paylaşan üyelere sahiptir ve yapılar gibi türetilmiş veri tipidir. Bir programda farklı durumlar için bazı değişkenler birbiri ile ilgili değildir fakat diğer değişkenler birbiri ile ilgili olabilir. Bundan dolayı birlikler kullanılmayan değişkenlerin boşu boşuna hafıza kullanımını önlemek için aynı hafıza alanını paylaşır. Birlik üyeleri herhangi bir tip olabilir. Union'da saklanacak byte miktarı, en az birliğin büyük hafıza alanı isteyen üyesini alacak şekilde olmalıdır. Çoğu durumda union'lar iki veya daha fazla veri tipi içerir. Kullanımda, sadece bir üye ve böylece bir veri tipi referans olarak kullanılabilir.


Union/Birlik Bildirimi

Birliklerin bildirimi de yapılarda olduğu gibidir. Yalnızca struct anahtar sözcüğü yerine union anahtar sözcüğü kullanılır.

union [birlik_ismi] {
    <tür> <birlik_elemanı>; 
    <tür> <birlik_elemanı>; 
    <tür> <birlik_elemanı>; 
    ...
}

Yukarıdaki genel biçimde:

union :                 Bildirim için gerekli bir anahtar sözcüktür.
birlik_ismi :         BirliÄŸi anlatan isimlendirme kurallarına uygun herhangi bir isim olabilir.
birlik_elemanı :   Birlik elemanıdır; isimlendirme kurallarına uygun herhangi bir isim olabilir.


Örnek:
union number {
int x;
double y;
};

Union/Birlik Değişkenlerinin Tanımlanması

Tıpkı yapılarda olduÄŸu gibi birliklerde de yer ayırma iÅŸlemi bildirim ile deÄŸil tanımlanma iÅŸlemi ile yapılmaktadır. Birlik bildirimlerinin yapı bildirimlerinde tek farkı struct anahtar sözcüğü yerine union anahtar sözcüğü kullanılmasıdır. 

Genel biçimi:

union <birlik_ismi> <birlik_deÄŸiÅŸkeninin_ismi>;

Örneğin;
union number {
int x;
double y;
}a,b;
veya

union number a,b;

Örnekler

1) union ve struct arasındaki fark
#include <stdio.h>
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("\nsize of structure = %d bytes", sizeof(sJob));
return 0;
}
Ekran Çıktısı:

size of union = 32 bytes
size of structure = 40 bytes

2)
#include <stdio.h>
#include <string.h>

union Data {
int i;
float f;
char str[20];
};

int main( ) {

union Data data;

printf( "Memory size occupied by data : %d\n", sizeof(data));

return 0;
}

Ekran Çıktısı:

Memory size occupied by data : 20

3)
#include <stdio.h>
#include <string.h>

union Data {
int i;
float f;
char str[20];
};

int main( ) {

union Data data;

data.i = 10;
data.f = 220.5;
strcpy( data.str, "C Programming");

printf( "data.i : %d\n", data.i);
printf( "data.f : %f\n", data.f);
printf( "data.str : %s\n", data.str);

return 0;
}

Ekran Çıktısı:

data.i : 1917853763
data.f : 4122360580327794900000000000000.000000
data.str : C Programming

4)

#include <stdio.h>

// Declaration of union is same as structures
union test {
int x, y;
};

int main()
{
// A union variable t
union test t;

t.x = 2; // t.y also gets value 2
printf("After making x = 2:\n x = %d, y = %d\n\n",
t.x, t.y);

t.y = 10; // t.x is also updated to 10
printf("After making y = 10:\n x = %d, y = %d\n\n",
t.x, t.y);
return 0;
}
Ekran Çıktısı:

After making x = 2:
 x = 2, y = 2

After making y = 10:
 x = 10, y = 10

5)
#include <stdio.h>

union test {
int x;
char y;
};

int main()
{
union test p1;
p1.x = 65;

// p2 is a pointer to union p1
union test* p2 = &p1;

// Accessing union members using pointer
printf("%d %c", p2->x, p2->y);
return 0;
}
Ekran Çıktısı:

65 A


C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:


Kaynaklar:
A'dan Z'ye C programlama
Deitel C/C++
https://www.tutorialspoint.com/cprogramming/c_unions.htm
https://www.programiz.com/c-programming/c-unions
https://www.geeksforgeeks.org/union-c/