C'de yapılara benzer objelerden birisi de birliktir. Birlik bellekte aynı alanı paylaşan değişkenlerin oluşturduğu objedir. Tanımlanmaları ve bir birlik değişkeninin ilan edilmesi yapılarınkine çok benzerdir:
union birlik_ismi {
değişken_tipi1 değişken_ismi1;
değişken_tipi2 değişken_ismi2;
değişken_tipi3 değişken_ismi3;
};
Aynı yapılarda olduğu gibi bu tanımlama bir değişken oluşturmaz. Değişken oluşturmak için değişkenin ayrıca tanımlanması gerekir:
union birlik_ismi değişken_ismi;
Bununla birlikte yine yapılardaki gibi değişkenler şöyle de ilan edilebilir:
union birlik_ismi {
değişken_tipi1 değişken_ismi1;
değişken_tipi2 değişken_ismi2;
değişken_tipi3 değişken_ismi3;
}; değişken_ismi1, değişken_ismi2,..., değişken_ismiN;
Örneğin aşağıdaki gibi bir birlik tanımlanmış olsun.
union letters{
short int a;
char b;
};
Bu durumda short int tipinin 2 char tipinin 1 byte yer tuttuğunu düşünürsek derleyici bu birlik için 2 byte yer ayıracaktır. Çünkü derleyici birlik için en büyük veri tipi kadar yer ayırır. Birliğin içerisindeki iki değişken de aynı yeri kullanacaktır.
#include <stdio.h>
int main(void){
union letters{
short int a;
char b;
};
union letters c;
c.a=321;
printf("%c",c.b);
return 0;
}
Örneğin yukarıda letters tipinde bir birlik tanımlanmıştır. Daha sonra bu tipte c isimli bir değişken ilan edilmiştir. Sonra bu değişkenin içindeki a elemanına 321 değeri verilmiştir. Bu sayı bellekte şu şekilde tutulacaktır.
00000001 01000001
Bu bellek biriminin en sağdaki bitleri aynı zamanda b elemanını da depoluyor olduğundan c.b şeklinde erişilen b elemanının değeri de şudur:
01000001
Bu sayının değeri 65'tir ve karakter karşılığı "A"dır. Bu nedenle "c.b" yazdırıldığında karşımıza "A" ifadesi çıkacaktır.
#include <stdio.h>
int main(void){
union letters{
short int a;
char b[2];
};
union letters c;
c.a=16961;
printf("%c\n",c.b[0]);
printf("%c\n",c.b[1]);
return 0;
}
Yuarıdaki örnekte ise aynı iki byte hem c.a elemanını hem de c.b karakter dizisini depolamaktadır. 16961 bellekte şu şekilde depolanır:
01000010 01000001
Bu aynı zamanda b elemanı olan dizinin ilk ve ikinci elemanlarıdır. Yani;
c.b[0] = 01000001
c.b[1] = 01000010
Bu değerlerin karakter karşılıkları da sırasıyla "A" ve "B"dir. Bu nedenle kod çalıştığında göreceğimiz çıktı şudur:
A
B
Yapılar <<<<< Temel C >>>>> Bit Alanları