Показивачи су витални за многе Ц програме, али могу бити тешки за разумевање. Прегледајте њихову синтаксу и како раде на практичним примерима.
Показивачи су суштински аспект Ц програмирања који ће вам требати добро разумевање да бисте ефикасно користили језик. Они помажу у ефикасном управљању меморијом, прослеђивању података по референци, руковању низовима и стринговима и још много тога. Међутим, они захтевају пажљиву употребу како би се избегле грешке.
Истражите детаље Ц показивача, од разумевања меморије и адреса до савладавања аритметике показивача.
Меморија и адресе
Меморија—често се користи као скраћеница за РАМ (Меморија са случајним приступом)—је простор за складиштење у рачунару који садржи податке и упутства које програм треба да покрене. Служи као радни простор за ваш програм. Најмања јединица меморије је обично бајт, који је једнак осам битова.
Свака меморијска локација има јединствену адресу и може да складишти различиту количину података у зависности од рачунара. Када декларишете променљиву у Ц, ви јој имплицитно додељујете меморијску локацију за складиштење њених података. Замислите то као кућу, која има јединствену адресу коју можете користити да бисте је лоцирали.
Замислите меморију вашег рачунара као низ ћелија за складиштење, од којих свака садржи бајт података. Рецимо да постоје две варијабле, Икс и и, у Ц програму:
int x = 5;
int y = 10;
У сећању, то би могло изгледати овако:
Адреса |
Подаци |
---|---|
1000 |
5 |
1004 |
10 |
Овде, одвојене меморијске локације чувају ове варијабле. Подаци који Икс представља се налази на меморијској адреси 1000, док и'с подаци заузимају меморијску адресу 1004.
Разумевање меморије и адреса је кључно када радите са показивачима јер су то променљиве које чувају меморијске адресе. Омогућавају вам приступ и манипулацију подацима ускладиштеним на одређеној меморијској локацији.
Декларисање и иницијализација показивача у Ц
Пре него што будете могли да мењате податке помоћу показивача у Ц-у, морате их декларисати и иницијализовати.
Декларација
Да бисте декларирали показивач, наведете тип података на који он указује, након чега слиједи звијездица (*), а затим име показивача. На пример:
int *ptr;
овде, инт *птр проглашава показивач именованим птр који може да ускладишти меморијску адресу целог броја.
Иницијализација
Након декларације, требало би да га иницијализујете са меморијском адресом на коју ће упућивати. Можете га иницијализирати овако:
int x = 5;
int *ptr = &x;
У овој декларацији, & оператор преузима адресу променљиве к. Код у суштини каже да је „птр променљива, она чува меморијску локацију целобројне вредности, а та локација је где год се к тренутно односи“.
Сада, птр садржи адресу целобројне променљиве Икс. На пример:
Променљива |
Адреса |
Валуе |
---|---|---|
Икс |
1000 |
5 |
птр |
1000 |
Показивачи у Ц-у не само да чувају адресу променљиве, већ имају и сопствену јединствену адресу у меморији рачунара.
Дереференцинг Поинтерс
Дереференцирање Ц показивача значи приступ вредности ускладиштеној на меморијској адреси на коју показује показивач.
Претпоставимо да имате показивач, инт *птр, који указује на целобројну променљиву, а та променљива има вредност 10. Да бисте приступили вредности преко показивача, користите звездицу (*) оператор:
int x = 10;
int *ptr = &x; // ptr points to the address of x
int value = *ptr; // Dereferencing ptr to get the value
Овај пример користи птр променљиву за преузимање вредности на меморијској адреси на коју указује. Тако, вредност сада има вредност 10, што је садржај Икс.
Поинтер Аритметика
Аритметика показивача је моћна карактеристика у Ц-у, посебно корисна за рад са низовима и стринговима (који су низови знакова). Омогућава вам да изводите аритметичке операције над показивачима за кретање по меморији.
Ево примера који показује како можете да га користите.
Почните тако што ћете прогласити низ целих бројева:
int numbers[] = {10, 20, 30};
Декларисајте показивач на инт и доделите му меморијску локацију низа бројева:
int *ptr = numbers;
Овде не морате да користите оператор „&“ јер су бројеви већ, имплицитно, тип показивача.
Променљива птр сада указује на први елемент у низу:
printf("%d\n", *ptr); // 10
Можете померити показивач на трећи елемент низа тако што ћете га повећати за 2:
ptr += 2;
printf("%d\n", *ptr); // 30
Можете да померите показивач уназад одузимањем од њега:
ptr--;
printf("%d\n", *ptr); ;// 20
Аритметика показивача је посебно корисна за навигацију низовима и рад са динамичком алокацијом меморије.
Показивачи и функције у Ц
ако ти разумеју како функције функционишу у Ц програмирању, онда сте на добром путу да користите показиваче функција. Ево неколико начина на које можете да их користите.
Функционални показивачи
Можете декларисати и користити показиваче функција за динамичко коришћење функција, баш као и сваку другу вредност. Ово је посебно корисно за повратне позиве и динамичко извршавање функција.
int (*operation)(int, int); // Declare a function pointer
operation = add; // Pointer to an add function
int result = operation(5, 3); // Call the function through the pointer
Овај код декларише показивач функције под називом операција која може указивати на функцију која узима два цела броја и враћа један. Додељује (показивач на) додати функција да операција. Затим користи променљиву операције за индиректан позив додај (5, 3).
Пролазећи по референци
Показивачи вам омогућавају да пренесете аргументе референцом на функције, омогућавајући вам да измените оригиналне податке унутар функције. Ово је кључно за функције које треба да промене вредност променљиве ван свог делокруга.
voidmodifyValue(int *x){
*x = 42; // Modifies the value of x in the calling code
}
Тхе модифиВалуе функција мења вредност било ког аргумента који јој позива позивни код поставља, постављајући је на 42.
Динамичка алокација меморије
Функције могу вратити показиваче на динамички додељену меморију. Ово је уобичајено када треба да креирате и вратите неограничене структуре података као што су низови или повезане листе. мораћете добро разумеју стацк и хеап меморију да га користим.
int *createArray(intsize){
int *arr = (int *)malloc(size * sizeof(int));
return arr;
}
Овај код дефинише функцију, цреатеАрраи, који узима цео број, величина, као улаз. Унутар функције, она динамички додељује меморију за целобројни низ одређене величине користећи маллоц. Након иницијализације низа, враћа показивач на овај новокреирани низ.
Уобичајене употребе
Показивачи су неопходни у Ц-у из неколико разлога, а шта су разликовати Ц од других програмских језика као што је Питхон. Ево неких уобичајених употреба:
- Динамичка алокација меморије
- Манипулација низом
- Пролазећи по референци
- Структуре података
- Управљање ресурсима
Разумевање ових уобичајених употреба показивача може побољшати ваше вештине Ц програмирања. Вежбајте неке од ових да бисте побољшали своје разумевање показивача.
Вежбајте коришћење показивача у Ц програмирању
Овладавање показивачима у Ц програмирању је драгоцена вештина која вам омогућава да ефикасно управљате меморијом, манипулишете подацима и обављате напредне операције. Вежбање и знање са показивачима ће у великој мери побољшати вашу способност да креирате робусне и ресурсно ефикасне Ц програме.