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. Значення змінної number дорівнює 50. Але адреса змінної-вказівника p дорівнює aaa3.

За допомогою * ( оператор непрямості ), ми можемо надрукувати значення змінної покажчика p.

javascript для циклу

Давайте розглянемо приклад вказівника, як пояснено для малюнка вище.

 #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) Динамічний розподіл пам'яті

java в об’єкт json

У мові c ми можемо динамічно виділяти пам'ять за допомогою функцій malloc() і calloc(), де використовується покажчик.

2) Масиви, функції та структури

Покажчики в мові c широко використовуються в масивах, функціях і структурах. Це зменшує код і покращує продуктивність.

Адреса оператора (&).

Адреса оператора '&' повертає адресу змінної. Але нам потрібно використовувати %u для відображення адреси змінної.

порівняння рядків java
 #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-

Тут ми повинні зауважити, що

динамічний масив java
  • (): Цей оператор є оператором у дужках, який використовується для оголошення та визначення функції.
  • []: цей оператор є оператором індексу масиву
  • * : Цей оператор є оператором покажчика.
  • Ідентифікатор: це ім'я вказівника. Цьому завжди буде віддаватися пріоритет.
  • Тип даних: тип даних — це тип змінної, на яку має вказувати покажчик. Він також містить такі модифікатори, як signed int, long тощо).

Як читати покажчик: int (*p)[10].

Щоб прочитати вказівник, ми повинні побачити, що () і [] мають однаковий пріоритет. Тому тут необхідно враховувати їхню асоціативність. Асоціативність зліва направо, тому пріоритет має ().

У дужках () оператор покажчика * та ім’я покажчика (ідентифікатор) p мають однаковий пріоритет. Отже, їх асоціативність має бути розглянута тут справа наліво, тому пріоритет переходить до p, а другий пріоритет переходить до *.

Призначте 3-й пріоритет [], оскільки тип даних має останній пріоритет. Тому вказівник матиме такий вигляд.

  • char -> 4
  • * -> 2
  • p -> 1
  • [10] -> 3

Вказівник читатиметься як p — вказівник на масив цілих чисел розміром 10.

приклад

Як читати наступний покажчик?

 int (*p)(int (*)[2], int (*)void)) 

Пояснення

Цей вказівник читатиметься як p — вказівник на таку функцію, яка приймає перший параметр як вказівник на одновимірний масив цілих чисел розміром два, а другий параметр — як вказівник на функцію, параметр якої недійсний, а тип повернення — ціле число.