Показивач у језику Ц је променљива која чува адресу друге променљиве. Ова променљива може бити типа инт, цхар, низ, функција или било који други показивач. Величина показивача зависи од архитектуре. Међутим, у 32-битној архитектури величина показивача је 2 бајта.
Размотрите следећи пример да дефинишете показивач који чува адресу целог броја.
int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer.
Декларисање показивача
Показивач у језику ц може се декларисати помоћу * (симбол звездице). Такође је познат као индиректни показивач који се користи за дереференцирање показивача.
int *a;//pointer to int char *c;//pointer to char
Пример показивача
Пример коришћења показивача за штампање адресе и вредности је дат у наставку.
Као што можете видети на горњој слици, променљива показивача чува адресу бројчане променљиве, тј. ффф4. Вредност бројчане променљиве је 50. Али адреса показивачке променљиве п је ааа3.
Уз помоћ * ( индиректни оператор ), можемо одштампати вредност показивачке променљиве п.
недефинисан нагиб
Погледајмо пример показивача како је објашњено за горњу слику.
#include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x ',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d ',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; }
Излаз
Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50
Показивач на низ
int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr.
Показивач на функцију
void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function
Показивач на структуру
struct st { int i; float f; }ref; struct st *p = &ref;
Предност показивача
1) Показивач смањује код и побољшава перформансе , користи се за преузимање стрингова, стабала итд. и користи се са низовима, структурама и функцијама.
2) Можемо враћају више вредности из функције користећи показивач.
3) То вас чини способним приступити било којој меморијској локацији у меморији рачунара.
Употреба показивача
Постоји много примена показивача у ц језику.
апплет
1) Динамичка алокација меморије
У језику ц, можемо динамички алоцирати меморију користећи маллоц() и цаллоц() функције где се користи показивач.
2) Низови, функције и структуре
јава слееп
Показивачи у језику ц се широко користе у низовима, функцијама и структурама. Смањује код и побољшава перформансе.
Адреса (&) оператера
Адреса оператора '&' враћа адресу променљиве. Али, треба да користимо %у да прикажемо адресу променљиве.
#include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; }
Излаз
value of number is 50, address of number is fff4
НУЛЛ Поинтер
Показивач коме није додељена никаква вредност али је НУЛЛ познат је као НУЛЛ показивач. Ако немате ниједну адресу коју треба навести у показивачу у време декларације, можете доделити вредност НУЛЛ. То ће обезбедити бољи приступ.
int *p=NULL;
У већини библиотека, вредност показивача је 0 (нула).
Поинтер Програм за замену два броја без коришћења 3. променљиве.
#include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf(' After swap: *p1=%d *p2=%d',*p1,*p2); return 0; }
Излаз
Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10
Читање сложених показивача
Постоји неколико ствари које се морају узети у обзир док читате сложене показиваче у Ц. Хајде да видимо приоритет и асоцијативност оператора који се користе у вези са показивачима.
Оператер | Предност | Асоцијативност |
---|---|---|
(), [] | 1 | С лева надесно |
*, идентификатор | 2 | Десна на лево |
Тип података | 3 | - |
Овде морамо приметити да,
- (): Овај оператор је оператор заграде који се користи за декларисање и дефинисање функције.
- []: Овај оператор је оператор низа индекса
- * : Овај оператор је оператор показивача.
- Идентификатор: То је име показивача. Овоме ће увек бити додељен приоритет.
- Тип података: Тип података је тип променљиве на коју показивач треба да покаже. Такође укључује модификатор као што је сигнед инт, лонг, итд.).
Како читати показивач: инт (*п)[10].
Да бисмо прочитали показивач, морамо видети да () и [] имају једнак приоритет. Стога се овде мора узети у обзир њихова асоцијативност. Асоцијативност је с лева на десно, тако да је приоритет ().
интегер доубле јава
Унутар заграде (), оператор показивача * и име показивача (идентификатор) п имају исти приоритет. Стога се овде мора узети у обзир њихова асоцијативност која је десна на лево, тако да приоритет иде на п, а други приоритет иде на *.
Доделите трећи приоритет [] пошто тип података има последњи приоритет. Према томе, показивач ће изгледати овако.
- цхар -> 4
- * -> 2
- п -> 1
- [10] -> 3
Показивач ће бити прочитан као п је показивач на низ целих бројева величине 10.
Пример
Како прочитати следећи показивач?
int (*p)(int (*)[2], int (*)void))
Објашњење
Овај показивач ће се читати као п је показивач на такву функцију која прихвата први параметар као показивач на једнодимензионални низ целих бројева величине два, а други параметар као показивач на функцију чији је параметар неважећи и тип враћања је цео број.