Покажчик на мові 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;
Перевага покажчика
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 — вказівник на таку функцію, яка приймає перший параметр як вказівник на одновимірний масив цілих чисел розміром два, а другий параметр — як вказівник на функцію, параметр якої недійсний, а тип повернення — ціле число.