logo

C'de Birlik

Birlik aynı bellek konumunda farklı veri türlerindeki farklı değişkenlerin bir koleksiyonu olan kullanıcı tanımlı bir veri türü olarak tanımlanabilir. Birlik aynı zamanda birçok üye olarak da tanımlanabilir, ancak yalnızca bir üye zaman içinde belirli bir noktada değer içerebilir.

Union, kullanıcı tanımlı bir veri türüdür ancak yapılardan farklı olarak aynı bellek konumunu paylaşırlar.

Bunu bir örnek üzerinden anlayalım.

 struct abc { int a; char b; } 

Yukarıdaki kod, iki üyeden, yani 'a' türünden oluşan, kullanıcı tanımlı bir yapıdır. int ve 'b' türü karakter . 'a' ve 'b' adreslerini kontrol ettiğimizde adreslerinin farklı olduğunu gördük. Dolayısıyla yapıdaki üyelerin aynı hafıza konumunu paylaşmadıkları sonucuna varıyoruz.

Birleşimi tanımladığımızda, birliğin yapı tanımlandığı gibi tanımlandığını ancak aradaki farkın, birleşim veri türünü tanımlamak için union anahtar sözcüğünün, yapıyı tanımlamak için ise struct anahtar sözcüğünün kullanıldığını gördük. Birleşim, veri üyelerini, yani 'a' ve 'b'yi içerir, her iki değişkenin adreslerini kontrol ettiğimizde, her ikisinin de aynı adreslere sahip olduğunu gördük. Bu, birlik üyelerinin aynı hafıza konumunu paylaştığı anlamına gelir.

Java değişmez listesi

Bellek tahsisinin resimli anlatımına bir göz atalım.

Aşağıdaki şekil yapının resimsel temsilini göstermektedir. Yapının iki üyesi vardır; yani biri tam sayı tipinde, diğeri ise karakter tipindedir. 1 blok 1 byte'a eşit olduğundan; bu nedenle 'a' değişkenine 4 blok bellek, 'b' değişkenine ise 1 blok bellek ayrılacaktır.

Aşağıdaki şekil sendika üyelerinin resimli temsilini göstermektedir. Her iki değişken de aynı hafıza konumunu paylaşıyor ve aynı başlangıç ​​adresine sahip.

Sendikada üyeler hafıza konumunu paylaşacaklardır. Herhangi bir üyede değişiklik yapmaya çalıştığımızda bu diğer üyeye de yansıyacaktır. Bu kavramı bir örnek üzerinden anlayalım.

 union abc { int a; char b; }var; int main() { var.a = 66; printf('
 a = %d', var.a); printf('
 b = %d', var.b); } 

Yukarıdaki kodda birliğin iki üyesi vardır, yani 'a' ve 'b'. 'Var', abc tipinin bir değişkenidir. İçinde ana() yönteminde 'a' değişkenine 66 değerini atarız, böylece var.a ekrana 66 değerini yazdırır. Hem 'a' hem de 'b' hafıza konumunu paylaştığından, var.b yazdıracak' B ' (66'nın ascii kodu).

Birliğin büyüklüğüne karar vermek

Birliğin büyüklüğü, birliğin en büyük üyesinin büyüklüğüne göre belirlenir.

Bir örnek üzerinden anlayalım.

 union abc{ int a; char b; float c; double d; }; int main() { printf('Size of union abc is %d', sizeof(union abc)); return 0; } 

Bildiğimiz gibi int'nin boyutu 4 byte, char'ın boyutu 1 byte, float'ın boyutu 4 byte ve double'ın boyutu 8 byte'tır. Double değişkeni dört değişken arasında en büyük hafızayı kapladığı için hafızada toplam 8 byte tahsis edilecektir. Bu nedenle yukarıdaki programın çıktısı 8 bayt olacaktır.

İşaretçileri kullanarak sendika üyelerine erişme

(->) ok operatörünü kullanarak işaretçiler aracılığıyla birliğin üyelerine erişebiliriz.

Bir örnek üzerinden anlayalım.

 #include union abc { int a; char b; }; int main() { union abc *ptr; // pointer variable declaration union abc var; var.a= 90; ptr = &var; printf('The value of a is : %d', ptr->a); return 0; } 

Yukarıdaki kodda var değişkeninin adresini saklayan *ptr gibi bir işaretçi değişkeni oluşturduk. Artık ptr (->) operatörünü kullanarak 'a' değişkenine erişebilir. Dolayısıyla yukarıdaki kodun çıktısı 90 olacaktır.

Neden C sendikalarına ihtiyacımız var?

C birleşimlerine olan ihtiyacı anlamak için bir örnek düşünün. İki ürünü olan bir mağazayı düşünelim:

  • Kitabın
  • Gömlekler

Mağaza sahipleri yukarıda belirtilen iki ürünün kayıtlarını ilgili bilgilerle birlikte saklamak isterler. Örneğin, Kitaplar Başlık, Yazar, sayfa sayısı ve fiyatı içerirken Gömlekler Renk, tasarım, boyut ve fiyatı içerir. 'Fiyat' özelliği her iki öğede de ortaktır. Mağaza sahibi mülkleri saklamak istiyor, ardından kayıtları nasıl saklayacak.

Başlangıçta kayıtları aşağıda gösterildiği gibi bir yapıda saklamaya karar verdiler:

 struct store { double price; char *title; char *author; int number_pages; int color; int size; char *design; }; 

Yukarıdaki yapı mağaza sahibinin depolamak istediği tüm ürünlerden oluşmaktadır. Yukarıdaki yapı tamamen kullanılabilir ancak fiyat hem eşyalarda ortak özelliktir hem de geri kalan eşyalar bireyseldir. Fiyat, *başlık, *yazar ve sayfa_sayısı gibi özellikler Kitaplara, renk, beden, *tasarım gibi özellikler ise Gömlek'e aittir.

Bakalım yapının üyelerine nasıl erişebiliriz .

 int main() { struct store book; book.title = 'C programming'; book.author = 'Paulo Cohelo'; book.number_pages = 190; book.price = 205; printf('Size is : %ld bytes', sizeof(book)); return 0; } 

Yukarıdaki kodda, türünde bir değişken oluşturduk. mağaza . Değişkenlere başlık, yazar, sayı_sayfa, fiyat değerlerini atadık ancak kitap değişkeni boyut, renk, tasarım gibi özelliklere sahip değil. Dolayısıyla bu bir hafıza israfıdır. Yukarıdaki yapının boyutu 44 byte olacaktır.

Rakorları kullanırsak çok fazla yerden tasarruf edebiliriz.

 #include struct store { double price; union { struct{ char *title; char *author; int number_pages; } book; struct { int color; int size; char *design; } shirt; }item; }; int main() { struct store s; s.item.book.title = 'C programming'; s.item.book.author = 'John'; s.item.book.number_pages = 189; printf('Size is %ld', sizeof(s)); return 0; } 

Yukarıdaki kodda, mağaza tipinde bir değişken oluşturduk. Yukarıdaki kodda birleşimleri kullandığımız için, değişkenin kapladığı en büyük bellek, bellek tahsisi için dikkate alınacaktır. Yukarıdaki programın çıktısı 32 bayttır. Yapılarda 44 bayt, birleşimlerde ise 44 bayt elde ettik. Bu nedenle, 44 bayt 32 bayttan büyüktür ve çok fazla bellek alanı tasarrufu sağlar.