899.80K

programing

1.

Вказівники
що воно таке і нащо його придумали
Хамник Микола
КБ-18

2.

• Вказівник (або “покажчик”) — це змінна, значенням якої є адреса комірки в
пам’яті. Вказівники оголошуються так само, як і звичайні змінні, тільки із
зірочкою між типом даних і ідентифікатором.
• Оператор адреси(&) дозволяє отримати адресу змінної, оператор
розіменування(*) - значення за адресою.

3.

Чому ж тип вказівника має збігатись з
типом змінної на яку він вказує?
• Виходячи з означення що таке вказівник можна подумати шо впринципі
немає значення якого типу буде вказівник, адже він просто тримає в собі
адресу, а вона в свою чергу складається лише з цифр.
Але є одне але, це мова C, тому не все так просто.

4.

Ось приклади того що впринципі неважливо(наразі) якого типу вказівник
Добре видно що незалежно
від того якого типу вказівник
адреса ж залишається і
відображається та сама

5.

Але…
якщо тут все працюватиме:
то тут змінивши a зі 123 на 1234
отримаємо неочікуваний результат:
Все це стається тому, що тип int
виділяє в пам’яті комп’ютера 4 байти а
сhar лише 1 байт.
Чому так?
В 1 варіанті все йде окей лише тому, що
int 123 займає всього лише 1 байт, а
сhar також займає лише 1 байт.
А так як вказівник в нас типу сhar
то і вказує він лише на адресу
першої комірки з двох
Число 123 в пам’яті
комп’ютера представлено так:
або
Як видно воно займає не
більше 1 байта (8 біт, кожне число
на верхній картинці це біт)
А от число 1234 вже має вигляд:
або
Основне, помітно, що число 1234
займає вже не 1 байт(не одну
комірку)
А коли ми викликаємо таку команду: printf(«%d\n",*ptr);
то вона повинна надрукувати(зчитати) значення за адресою, і
так як тип нашого вказівника сhar займає лише 1 байт,то
компілятор вважаючи що в комірку ми вписали тільки 1 символ
зчитає тільки той 1 символ і в результат видасть відповідне
значення з таблиці ASCII для числа D2.
А от значення в сусідній комірці: буде
проігноровано, адже для компілятора це вже
інше значення, а він свою комірку (розміром 1
байт вже прочитав)
* от лише чому компілятор друкує саме -46 мені з’ясувати
так і не вдалось, можливо специфіка компілятора

6.

Як тільки ми узгоджуємо тип вказівника і змінної на
яку він вказує, все стає на свої місця:
І хоч в «комірках» нічого не змінилось:
Але тепер компілятор розуміє що він зчитує тип int
який вже займає 4 байти, а це означає що він не
зупиниться тут:
А зчитає всі 4 байти інформації:

7.

Вказівники на функцію
Функції, як і змінні, при запуску програми зберігаються в пам’яті і як наслідок
також мають адресу. В функцію також можна передавати вказівник як
аргумент, це особливо зручно коли потрібно зміни які відбуваються зі змінною
в функції зберегти за межами цієї функції.

8.

Приклад функції яка приймає вказівник як значення аргументу
Якщо зробити все те саме але без
вказівника, то сума яку обраховує
функція так і залишиться в функції
А в C++ це все можна спростити
просто використовуючи посилання

9.

Функція яка за потреби збільшує масив на 1
потрібну кількість разів:
English     Русский Правила