logo

C Указатели

Указателят на езика 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; 
c указатели

Предимство на показалеца

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 е указател към такава функция, която приема първия параметър като указател към едномерен масив от цели числа с размер две, а вторият параметър като указател към функция, чийто параметър е празен и типът на връщане е цялото число.