Указателят на езика C е променлива, която съхранява адреса на друга променлива. Тази променлива може да бъде от тип int, char, array, function или друг указател. Размерът на показалеца зависи от архитектурата. В 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.
Деклариране на указател
Указателят на езика c може да бъде деклариран с помощта на * (символ звездичка). Известен е също като индиректен указател, използван за дерефериране на указател.
int *a;//pointer to int char *c;//pointer to char
Пример за показалец
Пример за използване на указатели за отпечатване на адреса и стойността е даден по-долу.
Както можете да видите на фигурата по-горе, променливата указател съхранява адреса на числовата променлива, т.е. fff4. Стойността на числовата променлива е 50. Но адресът на указателната променлива p е aaa3.
С помощта на * ( индиректен оператор ), можем да отпечатаме стойността на указателната променлива p.
баш ако условие
Нека видим примера с показалеца, както е обяснено за фигурата по-горе.
#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) Това ви прави способни достъп до всяко място в паметта в паметта на компютъра.
Използване на показалец
Има много приложения на указатели в езика c.
1) Динамично разпределение на паметта
В езика c можем динамично да разпределяме памет с помощта на функции malloc() и calloc(), където се използва указателят.
2) Масиви, функции и структури
Указателите в езика c се използват широко в масиви, функции и структури. Намалява кода и подобрява производителността.
Адрес на (&) оператор
Адресът на оператора '&' връща адреса на променлива. Но трябва да използваме %u, за да покажем адреса на променлива.
jtextfield
#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
NULL указател
Указател, на който не е присвоена никаква стойност, освен NULL, е известен като NULL указател. Ако нямате никакъв адрес, който да бъде указан в указателя по време на декларацията, можете да присвоите NULL стойност. Това ще осигури по-добър подход.
int *p=NULL;
В повечето библиотеки стойността на показалеца е 0 (нула).
Указател Програма за размяна на две числа без използване на третата променлива.
#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
Четене на сложни указатели
Има няколко неща, които трябва да се вземат под внимание, докато се четат сложните указатели в C. Нека видим приоритета и асоциативността на операторите, които се използват по отношение на указателите.
Оператор | Предимство | Асоциативност |
---|---|---|
(), [] | 1 | Отляво надясно |
*, идентификатор | 2 | От дясно на ляво |
Тип данни | 3 | - |
Тук трябва да отбележим, че
- (): Този оператор е оператор в скоби, използван за деклариране и дефиниране на функцията.
- []: Този оператор е долен оператор на масив
- * : Този оператор е оператор на указател.
- Идентификатор: Това е името на указателя. Приоритетът винаги ще бъде присвоен на това.
- Тип данни: Типът данни е типът на променливата, към която указателят е предназначен да сочи. Той също така включва модификатора като signed int, long и т.н.).
Как да четем указателя: int (*p)[10].
За да прочетем указателя, трябва да видим, че () и [] имат еднакъв приоритет. Следователно тук трябва да се има предвид тяхната асоциативност. Асоциативността е отляво надясно, така че приоритетът отива на ().
Вътре в скобата () операторът на указателя * и името на указателя (идентификатор) p имат еднакъв приоритет. Следователно тук трябва да се вземе предвид тяхната асоциативност, която е отдясно наляво, така че приоритетът отива на p, а вторият приоритет отива на *.
анализира низ до int
Задайте 3-ти приоритет на [], тъй като типът данни има последен приоритет. Следователно показалецът ще изглежда така.
- символ -> 4
- * -> 2
- p -> 1
- [10] -> 3
Указателят ще се чете като p е указател към масив от цели числа с размер 10.
Пример
Как да разчетем следния указател?
int (*p)(int (*)[2], int (*)void))
Обяснение
Този указател ще се чете като p е указател към такава функция, която приема първия параметър като указател към едномерен масив от цели числа с размер две, а вторият параметър като указател към функция, чийто параметър е празен и типът на връщане е цялото число.