Какво е указател в C?
The Pointer в C, е променлива, адреса на друга променлива. Пойнтер може да се използва и за препращане към друга функция на показалеца. Указателят може да бъде увеличен / намален, т.е. да сочи към следващото / предишното място в паметта. Целта на показалеца е да спести място в паметта и да постигне по-бързо време за изпълнение.
Как да използваме указатели в C
Ако декларираме променлива v от тип int, v действително ще съхранява стойност.
v е равно на нула сега.
Въпреки това, всяка променлива, освен стойността, има и своя адрес (или, казано по-просто, къде се намира в паметта). Адресът може да бъде извлечен чрез поставяне на амперсанд (&) преди името на променливата.
Ако отпечатате адреса на променлива на екрана, той ще изглежда като напълно произволно число (освен това може да се различава от изпълнение до изпълнение).
Нека опитаме това на практика с показалеца в пример C
Резултатът от тази програма е -480613588.
Сега, какво е указател? Вместо да съхранява стойност, показалецът ще съхранява адреса на променлива.
Променлива на указателя
Int * y = & v;
ПРОМЕНЛИВ |
ПОКАЗАТЕЛ |
А стойност се съхранява в името съхранение / адрес на паметта |
А променливи , че сочи към адреса на съхранение / памет на друга променлива |
Деклариране на указател
Подобно на променливите, указателите в програмирането на C трябва да бъдат декларирани, преди да могат да бъдат използвани във вашата програма. Указателите могат да бъдат наречени на каквото искате, стига да се подчиняват на правилата за именуване на C. Декларацията на указател има следната форма.
data_type * pointer_variable_name;
Тук,
- data_type е основният тип на указателя за типовете променливи C и указва типа на променливата, към който сочи указателят.
- Звездичката (*: същата звездичка, използвана за умножение), която е оператор на непрякост, декларира указател.
Нека да видим някои валидни декларации на указатели в този урок C указатели:
int *ptr_thing; /* pointer to an integer */int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */double *ptr2; /* pointer to a double */float *ptr3; /* pointer to a float */char *ch1 ; /* pointer to a character */float *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */
Инициализирайте указател
След деклариране на указател, ние го инициализираме като стандартни променливи с адрес на променлива. Ако указателите в програмирането на C не са неинициализирани и използвани в програмата, резултатите са непредсказуеми и потенциално катастрофални.
За да получим адреса на променлива, използваме оператора ampersand (&), поставен преди името на променлива, чийто адрес ни е необходим. Инициализацията на показалеца се извършва със следния синтаксис.
Синтаксис на указателя
pointer = &variable;
Проста програма за илюстрация на показалеца е дадена по-долу:
#includeint main(){int a=10; //variable declarationint *p; //pointer variable declarationp=&a; //store address of variable a in pointer pprintf("Address stored in a variable p is:%x\n",p); //accessing the addressprintf("Value stored in a variable p is:%d\n",*p); //accessing the valuereturn 0;}
Изход:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
Оператор | Значение |
* | Служи за две цели
|
& | Служи само с една цел
|
Видове указатели в C
Следват различните видове указатели в C :
Нулев указател
Можем да създадем нулев указател, като присвоим нулева стойност по време на декларацията на указателя. Този метод е полезен, когато нямате присвоен адрес на указателя. Нулевият указател винаги съдържа стойност 0.
Следващата програма илюстрира използването на нулев указател:
#includeint main(){int *p = NULL; //null pointerprintf(“The value inside variable p is:\n%x”,p);return 0;}
Изход:
The value inside variable p is:0
Показалец за празнота
При програмиране на C, празен указател се нарича също като общ указател. Той няма стандартен тип данни. Показалец за void се създава с помощта на ключовата дума void. Може да се използва за съхраняване на адрес на всяка променлива.
Следващата програма илюстрира използването на празен указател:
#includeint main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Изход:
The size of pointer is:4
Див указател
Казва се, че указателят е див указател, ако не е инициализиран с нищо. Този тип C указатели не са ефективни, тъй като те могат да сочат към някакво неизвестно място в паметта, което може да причини проблеми в нашата програма и може да доведе до срив на програмата. Винаги трябва да бъдете внимателни, докато работите с диви указатели.
Следващата програма илюстрира използването на див указател:
#includeint main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Изход
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
Други видове указатели в 'c' са както следва:
- Висящ показалец
- Комплексен указател
- Близо показалец
- Далечен показалец
- Огромен показалец
Указатели за директен и индиректен достъп
В C има два еквивалентни начина за достъп и манипулиране на променливо съдържание
- Директен достъп: използваме директно името на променливата
- Непряк достъп: използваме указател към променливата
Нека разберем това с помощта на програмата по-долу
#include/* Declare and initialize an int variable */int var = 1;/* Declare a pointer to int */int *ptr;int main( void ){/* Initialize ptr to point to var */ptr = &var;/* Access var directly and indirectly */printf("\nDirect access, var = %d", var);printf("\nIndirect access, var = %d", *ptr);/* Display the address of var two ways */printf("\n\nThe address of var = %d", &var);printf("\nThe address of var = %d\n", ptr);/*change the content of var through the pointer*/*ptr=48;printf("\nIndirect access, var = %d", *ptr);return 0;}
След компилиране на програмата без никакви грешки, резултатът е:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Аритметика на показалеца в C
Операциите на показалеца са обобщени на следващата фигура

Приоритетна операция (приоритет)
Когато работим с C указатели, трябва да спазваме следните правила за приоритет:
- Операторите * и & имат същия приоритет като унарните оператори (отрицанието!, Нарастването ++, декремент--).
- В същия израз унарните оператори *, &,!, ++, - се оценяват отдясно наляво.
Ако указателят P сочи към променлива X, тогава * P може да се използва навсякъде, където може да се напише X.
Следните изрази са еквивалентни:
int X = 10 int * P = & Y; За горния код, изразите по-долу са верни | |
Израз | Еквивалентен израз |
Y = * P + 1 * P = * P + 10 * P + = 2 ++ * P (* P) ++ | Y = X + 1 X = X + 10 X + = 2 ++ X X ++ |
В последния случай са необходими скоби: тъй като унарните оператори * и ++ се оценяват отдясно наляво, без скобите ще се увеличи указателят P, а не обектът, към който P сочи.
По-долу таблицата показва аритметичната и основната операция, която може да се използва при работа с C указатели
Операция | Обяснение |
Възлагане | int * P1, * P2 P1 = P2; P1 и P2 сочат към една и съща целочислена променлива |
Увеличаване и намаляване | Int * P1; P1 ++; P1-; |
Добавяне на отместване (Постоянно) | Това позволява на показалеца да премества N елементи в таблица. Показалецът ще бъде увеличен или намален с N пъти броя на байтовете от типа на променливата. Р1 + 5; |
C Указатели и масиви с примери
Традиционно имаме достъп до елементите на масива, използвайки неговия индекс, но този метод може да бъде елиминиран чрез използване на указатели. Указателите улесняват достъпа до всеки елемент от масив.
#includeint main(){int a[5]={1,2,3,4,5}; //array initializationint *p; //pointer declaration/*the ptr points to the first element of the array*/p=a; /*We can also type simply ptr==&a[0] */printf("Printing the array elements using pointer\n");for(int i=0;i<5;i++) //loop for traversing array elements{printf("\n%x",*p); //printing array elementsp++; //incrementing to the next element, you can also write p=p+1}return 0;}
Изход
12345
Добавянето на определено число към указател ще премести местоположението на показалеца към стойността, получена чрез операция за добавяне. Да предположим, че p е указател, който в момента сочи към мястото на паметта 0, ако изпълним следната операция по добавяне, p + 1, тогава тя ще се изпълни по този начин:

Тъй като в момента p сочи към местоположението 0 след добавяне на 1, стойността ще стане 1 и следователно указателят ще сочи към местоположението в паметта 1.
C Указатели и струни с примери
Низът е масив от обекти char, завършващ с нулев знак '\ 0'. Можем да манипулираме низове с помощта на указатели. Този указател в пример C обяснява този раздел
#include#include int main(){char str[]="Hello Guru99!";char *p;p=str;printf("First character is:%c\n",*p);p =p+1;printf("Next character is:%c\n",*p);printf("Printing all the characters in a string\n");p=str; //reset the pointerfor(int i=0;i Изход
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!Друг начин за справяне със низове е масив от указатели, както в следната програма:
#includeint main(){char *materials[ ] = { "iron", "copper", "gold"};printf("Please remember these materials :\n");int i ;for (i = 0; i < 3; i++) {printf("%s\n", materials[ i ]);}return 0;} Изход:
Please remember these materials:ironcoppergoldПредимства на указателите в C
- Указателите са полезни за достъп до места в паметта.
- Указателите осигуряват ефективен начин за достъп до елементите на масивна структура.
- Указателите се използват за динамично разпределение на паметта, както и освобождаване.
- Указателите се използват за формиране на сложни структури от данни като свързан списък, графика, дърво и т.н.
Недостатъци на указателите в C
- Указателите са малко сложни за разбиране.
- Указателите могат да доведат до различни грешки като грешки в сегментирането или да имат достъп до място в паметта, което изобщо не се изисква.
- Ако на указател е предоставена неправилна стойност, това може да причини повреда на паметта.
- Указателите също са отговорни за изтичането на памет.
- Указателите са сравнително по-бавни от тези на променливите.
- Програмистите са много трудни за работа с указателите; следователно е отговорност на програмиста да манипулира внимателно показалеца.
Обобщение
- Указателят не е нищо друго освен място в паметта, където се съхраняват данни.
- За достъп до местоположението в паметта се използва указател.
- Има различни видове указатели като нулев указател, див указател, празен указател и други видове указатели.
- Указателите могат да се използват с масив и низ за по-ефективен достъп до елементи.
- Можем да създадем указатели на функции за динамично извикване на функция.
- Аритметичните операции могат да се извършват върху указател, който е известен като аритметика на показалеца.
- Указателите могат също да сочат към функция, която улеснява извикването на различни функции в случай на дефиниране на масив от указатели.
- Когато искате да се справите с различен тип данни с променлива, можете да използвате указател за празен тип.