logo

Savienība C

savienība var definēt kā lietotāja definētu datu tipu, kas ir dažādu datu tipu dažādu mainīgo kopums vienā atmiņas vietā. Savienību var definēt arī kā vairākus dalībniekus, taču tikai viens dalībnieks var saturēt vērtību noteiktā laika brīdī.

kas ir build-essential ubuntu

Savienība ir lietotāja definēts datu tips, taču atšķirībā no struktūrām tiem ir viena un tā pati atmiņas vieta.

Sapratīsim to, izmantojot piemēru.

 struct abc { int a; char b; } 

Iepriekš minētais kods ir lietotāja definēta struktūra, kas sastāv no diviem elementiem, t.i., “a” tipa starpt un “b” tipa raksturs . Pārbaudot “a” un “b” adreses, mēs atklājām, ka to adreses atšķiras. Tāpēc mēs secinām, ka struktūras dalībniekiem nav vienādas atmiņas vietas.

Kad mēs definējam savienību, mēs atklājām, ka savienība tiek definēta tāpat kā struktūra, taču atšķirība ir tāda, ka savienības atslēgvārds tiek izmantots savienības datu veida definēšanai, bet atslēgvārds struct tiek izmantots struktūras definēšanai. Apvienībā ir datu dalībnieki, t.i., “a” un “b”, pārbaudot abu mainīgo adreses, mēs atklājām, ka abiem ir vienādas adreses. Tas nozīmē, ka arodbiedrības locekļiem ir viena un tā pati atmiņas vieta.

Apskatīsim atmiņas sadalījuma attēlu.

Zemāk esošajā attēlā parādīts struktūras attēlojums. Struktūrai ir divi locekļi; i., viens ir vesela skaitļa tipa, bet otrs ir rakstzīmju tipa. Tā kā 1 bloks ir vienāds ar 1 baitu; tādēļ mainīgajam “a” tiks piešķirti 4 atmiņas bloki, savukārt mainīgajam “b” tiks piešķirts 1 atmiņas bloks.

Zemāk esošajā attēlā parādīts arodbiedrības biedru attēlojums. Abiem mainīgajiem ir viena un tā pati atmiņas vieta, un tiem ir viena un tā pati sākotnējā adrese.

css teksta aplaušanai

Savienībā dalībnieki dalīsies atmiņas vietā. Ja mēs mēģināsim veikt izmaiņas kādā no dalībniekiem, tas tiks atspoguļots arī citā biedrā. Izpratīsim šo jēdzienu, izmantojot piemēru.

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

Iepriekš minētajā kodeksā arodbiedrībai ir divi locekļi, t.i., “a” un “b”. “Var” ir savienības abc tipa mainīgais. Iekš galvenais () metodi, mēs piešķiram 66 mainīgajam “a”, tāpēc var.a uz ekrāna izdrukās 66. Tā kā gan “a”, gan “b” koplieto atmiņas vietu, var.b drukās' B (ASCII kods 66).

Arodbiedrības lieluma noteikšana

Arodbiedrības lielums ir balstīts uz lielākās arodbiedrības biedra lielumu.

Sapratīsim, izmantojot piemēru.

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

Kā zināms, int lielums ir 4 baiti, char izmērs ir 1 baits, float izmērs ir 4 baiti un dubultā izmērs ir 8 baiti. Tā kā dubultais mainīgais aizņem lielāko atmiņu starp visiem četriem mainīgajiem, kopā atmiņā tiks piešķirti 8 baiti. Tāpēc iepriekš minētās programmas izvade būtu 8 baiti.

do un while cilpa java

Piekļuve arodbiedrības biedriem, izmantojot norādes

Mēs varam piekļūt arodbiedrības biedriem, izmantojot norādes, izmantojot (->) bultiņu operatoru.

Sapratīsim, izmantojot piemēru.

 #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; } 

Iepriekš minētajā kodā esam izveidojuši rādītāja mainīgo, t.i., *ptr, kas saglabā mainīgā mainīgā adresi. Tagad ptr var piekļūt mainīgajam 'a', izmantojot operatoru (->). Tādējādi iepriekš minētā koda izvade būtu 90.

Kāpēc mums ir vajadzīgas C savienības?

Apsveriet vienu piemēru, lai saprastu nepieciešamību pēc C arodbiedrībām. Apskatīsim veikalu, kurā ir divas preces:

  • Grāmatas
  • Krekli

Veikalu īpašnieki vēlas saglabāt abu iepriekš minēto preču ierakstus kopā ar attiecīgo informāciju. Piemēram, grāmatās ir iekļauts nosaukums, autors, lappušu skaits, cena un krekli ietver krāsu, dizainu, izmēru un cenu. Rekvizīts “cena” ir kopīgs abās vienībās. Veikala īpašnieks vēlas saglabāt īpašumus, tad kā viņš/viņa glabās ierakstus.

Sākotnēji viņi nolēma saglabāt ierakstus tādā struktūrā, kā parādīts tālāk:

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

Iepriekš minētā struktūra sastāv no visām precēm, kuras veikala īpašnieks vēlas uzglabāt. Iepriekš minētā struktūra ir pilnībā lietojama, taču cena ir kopīpašums gan precēm, gan pārējās preces ir individuālas. Rekvizīti, piemēram, cena, *nosaukums, *autors un lappušu_skaits, pieder grāmatām, savukārt krāsa, izmērs, *dizains pieder kreklam.

Apskatīsim, kā mēs varam piekļūt struktūras dalībniekiem .

 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; } 

Iepriekš minētajā kodā esam izveidojuši tipa mainīgo veikals . Mēs esam piešķīruši vērtības mainīgajiem lielumiem, nosaukumam, autoram, lappušu skaits, cena, bet grāmatas mainīgajam nav tādu īpašību kā izmērs, krāsa un dizains. Līdz ar to tā ir atmiņas izniekošana. Iepriekš minētās struktūras lielums būtu 44 baiti.

Mēs varam ietaupīt daudz vietas, ja izmantosim arodbiedrības.

 #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; } 

Iepriekš minētajā kodā esam izveidojuši mainīgo tipa veikals. Tā kā mēs izmantojām savienības iepriekš minētajā kodā, atmiņas piešķiršanai tiks ņemta vērā lielākā mainīgā aizņemtā atmiņa. Iepriekš minētās programmas izvade ir 32 baiti. Struktūru gadījumā mēs ieguvām 44 baitus, savukārt savienību gadījumā iegūtais izmērs ir 44 baiti. Tādējādi 44 baiti ir lielāki par 32 baitiem, ietaupot daudz atmiņas.

c