logo

Унија у Ц

унија може се дефинисати као кориснички дефинисан тип података који је скуп различитих варијабли различитих типова података на истој меморијској локацији. Унија се такође може дефинисати као више чланова, али само један члан може да садржи вредност у одређеном тренутку.

Унион је кориснички дефинисан тип података, али за разлику од структура, оне деле исту меморијску локацију.

Хајде да ово разумемо кроз пример.

 struct abc { int a; char b; } 

Горњи код је кориснички дефинисана структура која се састоји од два члана, тј. 'а' типа инт и 'б' типа карактера . Када смо проверили адресе 'а' и 'б', открили смо да су њихове адресе различите. Стога закључујемо да чланови у структури не деле исту меморијску локацију.

буббле сорт јава

Када дефинишемо унију, открили смо да је унија дефинисана на исти начин као што је дефинисана структура, али разлика је у томе што се кључна реч унион користи за дефинисање типа података уније, док се кључна реч струцт користи за дефинисање структуре. Унија садржи чланове података, тј. 'а' и 'б', када проверимо адресе обе променљиве онда смо открили да обе имају исте адресе. То значи да чланови синдиката деле исту меморијску локацију.

Хајде да погледамо сликовни приказ алокације меморије.

На слици испод приказан је сликовни приказ структуре. Структура има два члана; тј. један је целобројног типа, а други карактерног типа. Пошто је 1 блок једнак 1 бајту; стога ће променљивој 'а' бити додељена 4 блока меморије, док ће променљивој 'б' бити додељен 1 блок меморије.

На слици испод приказан је сликовни приказ чланова синдиката. Обе варијабле деле исту меморијску локацију и имају исту почетну адресу.

бинарно дрво

У синдикату, чланови ће делити меморијску локацију. Ако покушамо да извршимо промене у неком од чланова, то ће се одразити и на другог члана. Хајде да разумемо овај концепт кроз пример.

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

У горњем коду, синдикат има два члана, тј. 'а' и 'б'. 'вар' је променљива типа унион абц. У главни() методом, додељујемо 66 променљивој 'а', тако да ће вар.а исписати 66 на екрану. Пошто и 'а' и 'б' деле меморијску локацију, вар.б штампаће ' Б ' (асции код од 66).

Одлучивање о величини синдиката

Величина синдиката се заснива на величини највећег члана синдиката.

Хајде да разумемо кроз пример.

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

Као што знамо, величина инт је 4 бајта, величина цхар је 1 бајт, величина флоат-а је 4 бајта, а величина доубле је 8 бајтова. Пошто променљива доубле заузима највећу меморију међу све четири варијабле, тако ће укупно 8 бајтова бити додељено меморији. Према томе, излаз горњег програма би био 8 бајтова.

путовање али

Приступ члановима синдиката помоћу показивача

Члановима синдиката можемо приступити преко показивача помоћу (->) оператора стрелице.

Хајде да разумемо кроз пример.

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

У горњем коду смо креирали променљиву показивача, тј. *птр, која чува адресу променљиве вар. Сада птр може да приступи променљивој 'а' коришћењем (->) оператора. Стога би излаз горњег кода био 90.

Зашто су нам потребни синдикати Ц?

Размотрите један пример да бисте разумели потребу за Ц синдикатима. Хајде да размотримо продавницу која има две ставке:

  • Књиге
  • Кошуље

Власници продавница желе да чувају евиденцију о горе поменутим артиклима заједно са релевантним информацијама. На пример, књиге укључују наслов, аутора, број страница, цену, а кошуље укључују боју, дизајн, величину и цену. Својство 'прице' је заједничко за обе ставке. Власник продавнице жели да складишти својства, а затим како ће чувати записе.

У почетку су одлучили да чувају записе у структури као што је приказано у наставку:

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

Горња структура се састоји од свих ставки које власник продавнице жели да ускладишти. Наведена структура је у потпуности употребљива али је цена заједничка својина и код ставки, а остали артикли су појединачни. Својства као што су цена, *наслов, *аутор и број_странице припадају Књигама, док боја, величина, *дизајн припадају Мајци.

Хајде да видимо како можемо приступити члановима структуре .

свитцх метод јава
 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; } 

У горњем коду смо креирали променљиву типа продавница . Доделили смо вредности варијаблама, наслов, аутор, број_странице, цена, али променљива књига не поседује својства као што су величина, боја и дизајн. Дакле, то је губитак памћења. Величина горње структуре би била 44 бајта.

Можемо уштедети много простора ако користимо синдикате.

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

У горњем коду смо креирали променљиву типа сторе. Пошто смо користили уније у горњем коду, па би највећа меморија коју заузима променљива била узета у обзир за алокацију меморије. Излаз горњег програма је 32 бајта. У случају структура добили смо 44 бајта, док је у случају синдиката добијена величина 44 бајта. Дакле, 44 бајта је веће од 32 бајта, чиме се штеди много меморијског простора.