Шта је класа складиштења у Ц-у?
Класа складишта представља видљивост и локацију променљиве. Каже из ког дела кода можемо да приступимо променљивој. Класа складишта у Ц користи се за описивање следећих ствари:
- Променљиви опсег.
- Локација на којој ће се чувати променљива.
- Иницијализована вредност променљиве.
- Животни век променљиве.
- Ко може приступити променљивој?
Стога се класа меморије користи за представљање информација о променљивој.
НАПОМЕНА: Варијабла није повезана само са типом података, његовом вредношћу, већ и са класом меморије.
Постоје укупно четири врсте стандардних класа за складиштење. Табела у наставку представља класе складиштења у Ц.
Класа складиштења | Сврха |
ауто | То је подразумевана класа за складиштење. |
екстерн | То је глобална променљива. |
статички | То је локална променљива која може да врати вредност чак и када се контрола пренесе на позив функције. |
регистровати | То је променљива која се чува унутар Регистра. |
У овом Ц водичу научићете различите типове класа складиштења у Ц са примерима-
- Класа аутоматског складиштења у Ц.
- Класа екстерног складишта у Ц.
- Прва датотека: маин.ц
- Друга датотека: оригинал.ц
- Класа статичког складиштења у Ц.
- Региструјте класу складишта у Ц
Класа аутоматског складиштења у Ц.
Променљиве дефинисане помоћу класе аутоматског складиштења називају се локалним променљивим. Ауто означава класу аутоматског складиштења. Променљива је подразумевано у класи аутоматског складиштења ако није изричито наведена.
Опсег аутоматске променљиве ограничен је само на одређени блок. Једном када контрола изађе из блока, приступ се уништава. То значи да му може приступити само блок у којем је декларисана аутоматска променљива.
Кључна реч ауто користи се за дефинисање класе аутоматског складиштења. Подразумевано, аутоматска променљива садржи вредност смећа.
Example, auto int age;
Програм у наставку дефинише функцију са две локалне променљиве
int add(void) {int a=13;auto int b=48;return a+b;}
Узмемо други програм који приказује ниво опсега „ниво видљивости“ за аутоматске променљиве у сваком блоковском коду који су међусобно независно:
#includeint main( ){auto int j = 1;{auto int j= 2;{auto int j = 3;printf ( " %d ", j);}printf ( "\t %d ",j);}printf( "%d\n", j);}
ИЗЛАЗ:
3 2 1
Класа екстерног складишта у Ц.
Ектерн означава класу екстерног складишта. Класа екстерног складишта користи се када имамо глобалне функције или променљиве које се деле између две или више датотека.
Кључна реч ектерн користи се за декларисање глобалне променљиве или функције у другој датотеци да би се пружила референца променљиве или функције које су већ дефинисане у оригиналној датотеци.
Променљиве дефинисане помоћу кључне речи ектерн називају се глобалним променљивим. Ове променљиве су доступне током целог програма. Приметите да се спољна променљива не може иницијализовати већ је дефинисана у оригиналној датотеци.
Example, extern void display();
Прва датотека: маин.ц
#includeextern i;main() {printf("value of the external integer is = %d\n", i);return 0;}
Друга датотека: оригинал.ц
#includei=48;
Резултат:
value of the external integer is = 48
Да бисте компајлирали и покренули горњи код, следите кораке у наставку
Корак 1) Направите нови пројекат,
- Изаберите Апликација конзоле
- Кликните на Го
Корак 2) Изаберите Ц и кликните на Нект
Корак 3) Кликните на Нект
Корак 4) Унесите детаље и кликните Даље
Корак 5) Кликните Заврши
Корак 6) Ставите главни код као што је приказано у претходном програму у датотеку маин.ц и сачувајте га
Корак 7) Направите нову Ц датотеку [Филе -> нев -> Емпти Филе, спремите (као оригинал.ц) и додајте је у тренутни пројекат кликом на „ОК“ у дијалошком оквиру.
Корак 8) Ставите и сачувајте Ц код датотеке оригинал.ц приказан у претходном примеру без функције маин ().
Корак 9) Изградите и покрените свој пројекат. Резултат је приказан на следећој слици
Класа статичког складиштења у Ц.
Статичке променљиве се користе у функцији / датотеци као локалне статичке променљиве. Такође се могу користити као глобална променљива
- Статичка локална променљива је локална променљива која задржава и чува своју вредност између позива функције или блока и остаје видљива само функцији или блоку у којем је дефинисана.
- Статичке глобалне променљиве су глобалне променљиве видљиве само датотеци у којој су декларисане.
Example: static int count = 10;
Имајте на уму да статичка променљива има подразумевану почетну вредност нула и да се иницијализује само једном у свом животном веку.
#include/* function declaration */void next(void);static int counter = 7; /* global variable */main() {while(counter<10) {next();counter++; }return 0;}void next( void ) { /* function definition */static int iteration = 13; /* local static variable */iteration ++;printf("iteration=%d and counter= %d\n", iteration, counter);}
Резултат:
iteration=14 and counter= 7iteration=15 and counter= 8iteration=16 and counter= 9
Глобалне променљиве су доступне у целој датотеци, док су статичке променљиве доступне само одређеном делу кода.
Животни век статичке променљиве је у целом програмском коду. Променљива која је декларисана или иницијализована помоћу статичке кључне речи увек садржи нулу као подразумевану вредност.
Региструјте класу складишта у Ц
Класу складиштења регистра можете користити када желите да локалне променљиве похраните у функције или блокове у ЦПУ регистре уместо РАМ-а да бисте имали брзи приступ тим променљивим. На пример, „бројачи“ су добар кандидат за чување у регистру.
Example: register int age;
Кључна реч регистер се користи за декларацију класе складишта регистра. Променљиве декларисане коришћењем класе складишта регистра имају животни век током целог програма.
Слична је класи аутоматског складиштења. Варијабла је ограничена на одређени блок. Једина разлика је у томе што се променљиве декларисане коришћењем класе складиштења регистра чувају у ЦПУ регистрима уместо у меморији. Регистар има бржи приступ од приступа главној меморији.
Променљиве декларисане коришћењем класе складишта регистра немају подразумевану вредност. Ове променљиве се често декларишу на почетку програма.
#include/* function declaration */main() {{register int weight;int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}}
ИЗЛАЗ:
error: address of register variable 'weight' requested
Следећа табела сумира главне карактеристике сваке класе меморије које се обично користе у програмирању на језику Ц.
Класа складиштења | Изјава | Складиште | Подразумевана почетна вредност | Обим | Животни век |
ауто | Унутар функције / блока | Меморија | Непредвидиво | У оквиру функције / блока | У оквиру функције / блока |
регистровати | Унутар функције / блока | Регистри ЦПУ-а | Смеће | У оквиру функције / блока | У оквиру функције / блока |
екстерн | Изван свих функција | Меморија | Нула | Читав фајл и друге датотеке где је променљива декларисана као екстерна | време извођења програма |
Статички (локални) | Унутар функције / блока | Меморија | Нула | У оквиру функције / блока | време извођења програма |
Статички (глобално) | Изван свих функција | Меморија | Нула | Глобално | време извођења програма |
Резиме
У овом упутству смо разговарали о класама складиштења у Ц, да сумирамо:
- Класа меморије у Ц користи се за представљање додатних информација о променљивој.
- Класа складишта представља опсег и животни век променљиве.
- Такође говори ко може да приступи променљивој и одакле?
- Ауто, ектерн, регистер, статиц су четири различите класе меморије у Ц програму.
- Спецификатор класе складишта на језику Ц користи се за дефинисање променљивих, функција и параметара.
- ауто се користи за локалну променљиву дефинисану у блоку или функцији
- регистер користи се за чување променљиве у ЦПУ регистрима, а не меморијској локацији за брзи приступ.
- Статичка се користи и за глобалне и за локалне променљиве. Свака има свој случај употребе у оквиру програма Ц.
- Ектерн се користи за размену података између датотека Ц пројекта.