Похожие презентации:
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потрібну кількість разів: