У овом упутству ћете научити о показивачима; шта су показивачи, како их користите и уобичајене грешке са којима бисте се могли суочити приликом рада са њима уз помоћ примера.
Показивачи су моћне карактеристике програмирања на Ц и Ц ++. Пре него што научимо показиваче, научимо о адресама у програмирању на језику Ц.
Адреса у Ц.
Ако у свом програму имате променљиву вар, &var
даће вам адресу у меморији.
Адресу смо користили много пута док смо користили scanf()
функцију.
scanf("%d", &var);
Овде се вредност коју је унео корисник чува у адреси променљиве променљиве. Узмимо радни пример.
#include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; )
Оутпут
вар: 5 адреса вар: 2686778
Напомена: Вероватно ћете добити другу адресу када покренете горњи код.
Ц Показивачи
Показивачи (променљиве показивача) су посебне променљиве које се користе за чување адреса, а не вредности.
Синтакса показивача
Ево како можемо прогласити показиваче.
int* p;
Овде смо прогласили показивач п int
типа.
Показиваче можете пријавити и на ове начине.
int *p1; int * p2;
Узмимо још један пример проглашавања показивача.
int* p1, p2;
Овде смо прогласили показивач п1 и нормалну променљиву п2.
Додељивање адреса Поинтерима
Узмимо пример.
int* pc, c; c = 5; pc = &c;
Овде се 5 додељује променљивој ц. И, адреса ц додељује се пц показивачу.
Добијте вредност ствари на коју указују показивачи
Да бисмо добили вредност ствари на коју указују показивачи, користимо *
оператор. На пример:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Овде је адреса c
рачунара додељена показивачу рачунара. Да бисмо добили вредност сачувану на тој адреси, користили смо * пц.
Напомена: У горњем примеру, пц је показивач, а не *pc
. Не можете и не треба да учините нешто слично *pc = &c
;
Успут, *
назива се оператор преусмеравања (када се ради са показивачима). Функционише на показивачу и даје вредност сачувану у том показивачу.
Промена вредности коју указују показивачи
Узмимо пример.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
Показивачу смо доделили адресу ц.
Затим смо променили вредност ц у 1. С обзиром да су пц и адреса ц исте, *pc
добијамо 1.
Узмимо још један пример.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
Показивачу смо доделили адресу ц.
Затим смо *pc
користили 1 *pc = 1;
. Пошто су пц и адреса ц исти, ц ће бити једнако 1.
Узмимо још један пример.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
У почетку се адреса ц додељује пц показивачу помоћу pc = &c;
. Пошто је ц 5, *pc
даје нам 5.
Затим се адреса д додељује показивачу рачунара помоћу pc = &d;
. Пошто је д -15, *pc
даје нам -15.
Пример: Рад показивача
Узмимо радни пример.
#include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; )
Оутпут
Адреса ц: 2686784 Вредност ц: 22 Адреса показивача пц: 2686784 Садржај показивача пц: 22 Адреса показивача пц: 2686784 Садржај показивача пц: 11 Адреса ц: 2686784 Вредност ц: 2
Објашњење програма
int* pc, c;
Here, a pointer pc and a normal variable c, both of typeint
, is created.
Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.c = 22;
This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.pc = &c;
This assigns the address of variable c to the pointer pc.c = 11;
This assigns 11 to variable c.*pc = 2;
This change the value at the memory location pointed by the pointer pc to 2.
Common mistakes when working with pointers
Suppose, you want pointer pc to point to the address of c. Then,
int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;
Here's an example of pointer syntax beginners often find confusing.
#include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )
Why didn't we get an error when using int *p = &c;
?
It's because
int *p = &c;
is equivalent to
int *p: p = &c;
У оба случаја креирамо показивач p
(не *p
) и додељујемо &c
му.
Да бисмо избегли ову забуну, можемо користити следећу изјаву:
int* p = &c;
Сада знате шта су показивачи, у следећем водичу сазнаћете како су показивачи повезани са низовима.