Bir Yapı arasındaki farkı ve C Birliği
Herhangi bir iyi örnek struct
union
Bir bir arasındaki fark vermek var mı?
Temelde struct
üye tüm bellek kullanır ve union
en büyük üyeleri hafıza alanı kullandığını biliyorum. Başka bir OS düzeyde fark var mıdır?
CEVAP
Bir sendika ile aynı yerde saklı çünkü hepsi unsurlardan birini kullanmak gerekiyor. Bu çeşitli biri olabilecek bir şey saklamak istediğiniz zaman yararlı olur. Bir yapı, diğer taraftan, parçaların her biri için ayrı bir bellek yeri vardır ve hepsi aynı anda kullanılabilir.
Kullanımları somut bir örnek vermek gerekirse, Düzeni bir tercüman, bir süre önce üzerinde çalıştığım ve aslında Düzeni C veri tipleri üzerine veri türleri taklit ediyordum. Bu bir yapı içinde bir numaralandırma değeri yazın ve bu değeri saklamak için bir birlik gösteren saklanması dahil.
union foo {
int a; // can't use both a and b at once
char b;
} foo;
struct bar {
int a; // can use both a and b simultaneously
char b;
} bar;
union foo x;
x.a = 3; // OK
x.b = 'c'; // NO! this affects the value of x.a!
struct bar y;
y.a = 3; // OK
y.b = 'c'; // OK
düzenleme:X ayarı ne olduğunu merak ediyorsanız.b '' değişiklikleri x değeri için c bir, teknik olarak bakılırsa, tanımlanmamış. En modern makinelerde bir char 1 byte ve int 4 bayt x veriyor.b değeri 'c' de x ilk bayt verir.aynı değeri:
union foo x;
x.a = 3;
x.b = 'c';
printf("%i, %i\n", x.a, x.b);
yazdırır
99, 99
Neden iki değeri aynı mı? Int 3 son 3 bayt sıfır olduğu için, bu yüzden de 99 olarak okunur. X için daha büyük bir sayı koyarsak.bir, bu her zaman böyle olmadığını görürsünüz.
union foo x;
x.a = 387439;
x.b = 'c';
printf("%i, %i\n", x.a, x.b);
yazdırır
387427, 99
Gerçek bellek değerleri daha yakından bakmak için izin ayarlamak ve hex değerleri çıktı
union foo x;
x.a = 0xDEADBEEF;
x.b = 0x22;
printf("%x, %x\n", x.a, x.b);
yazdırır
deadbe22, 22
Açıkça 0x22 bu 0xEF üzerine olduğunu görürsün.
AMA
C, int bayt sırasıtanımlı değil.Bu program Mac bilgisayarımda 0x22 ile 0xEF üzerine, ama int, bayt sırası tersine ... çünkü 0xDE yerine üzerine diğer platformlar vardır. Bir program yazarken, bu nedenle, hiç taşınabilir değil çünkü bir Birliği üzerine belirli bir veri davranışını güvenilmemelidir.
Bayt sırası hakkında daha fazla okuma için, endianness check out.
AutomaticallyAdjustsScrollViewİnsets, ...
Nasıl iki tarih arasındaki farkı saniy...
Nasıl iki resim arasındaki farkı ölçeb...
gerçekten usul arasındaki farkı anlama...
Gövde ve dal arasındaki farkı bulun?...