Birlikler

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ı