але компілятор видасть при цьому попередження, якщо тільки спочатку покажчик не був оголошений з типом void. У С (але не в С + +) ви можете призначити покажчик void * на покажчик, який не має тип void *. p align="justify"> Якщо type є будь зумовлений або визначений користувачем тип, включаючи void, то оголошення * ptr ;/ * Небезпечно - неініціалізованих покажчик */
оголосить ptr як "покажчик на тип type". До оголошеного таким образомоб'екту ptr застосовні всі правила, пов'язані з контекстом, тривалістю і видимістю. p align="justify"> Покажчик зі значенням null це адреса, гарантовано відмінний від будь-якого допустимого покажчика, використовуваного в програмі. Присвоєння вказівником цілої константи 0 привласнює вказівником значення null. p align="justify"> Покажчик типу "покажчик на void" не слід плутати з нульовим (null) покажчиком.
Арифметичні операції з покажчиками
Внутрішні арифметичні операції з покажчиками залежать від діючої моделі пам'яті і наявності переобумовленої модифікаторів покажчика. Різниця між двома значеннями покажчиків має сенс тільки в тому випадку, якщо обидва вони вказують на один масив. p align="justify"> Арифметичні операції з покажчиками обмежені складанням, відніманням і порівнянням. Арифметичні операції з покажчиками об'єктів типу "покажчик на тип type" автоматично враховують розмір етоготіпа, тобто число байт, необхідне для зберігання в пам'яті об'єкта даного типу. При виконанні арифметичних операцій з покажчиками передбачається, що покажчик вказує на масив об'єктів. Таким чином, якщо покажчик оголошений як покажчик на type, то збільшення до нього цілочисельного значення переміщає покажчик на відповідну кількість об'єктів type. Якщо type має розмір 10 байтів, то додаток цілого числа 5 до покажчика цього типу переміщає покажчик в пам'яті на 50 байт. Різниця являє собою число елементів масиву, що розділяють два значення покажчиків. Наприклад, якщо ptr1 вказує на третій елемент масиву, а ptr2 на десятий, то результатом виконання віднімання ptr2 - ptr1 буде 7Е
Контрольні питання:
1. Поясніть організацію пам'яті і адресацію.
2. Розкажіть про покажчики.
Лекція № 11
Тема: Масиви
План:
1. Одновимірні масиви і покажчики.
2. Двовимірні масиви.
. Використання покажчиків для двовимірних масивів.
Масиви - це група елементів однакового типу (double, float, int і т.п.). З оголошення масиву компілятор повинен отримати інформацію про тип елементів масиву та їх кількості. Оголошення масиву має два формати:
специфікатор-типу описувач [константне - вираз];
специфікатор-типу описувач [];
Описувач - це ідентифікатор масиву.
Специфікатор-типу задає тип елементів оголошується масиву. Елементами масиву не можуть бути функції і елементи типу void. p align="justify"> Константне-вираз у квадратних дужках задає кількість елементів масиву. Константне-вираз при оголошенні масиву може бути опущено в наступних випадках:
при оголошенні масив ініціалізується,
масив оголошений як формальний параметр функції,
масив оголошений як посилання на масив, явно певний в іншому файлі.
У мові СІ визначені тільки одномірні масиви, але оскільки елементом масиву може бути масив, можна визначити і багатовимірні масиви. Вони формалізуються списком константних-виразів наступних за ідентифікатором масиву, причому кожне константне-вираз полягає у свої квадратні дужки. p align="justify"> Кожне константне-вираз у квадратних дужках визначає число елементів з даного вимірюванню масиву, так що оголошення двомірного масиву містить два константних-вирази, тривимірного - три і т.д. Зазначимо, що в мові СІ перший елемент масиву має індекс рівний 0. p align="justify"> Приклади: a [2] [3];/* представлено у вигляді матриці
a [0] [0] a [0] [1] a [0] [2] [1] [0] a [1] [1] a [1] [2] * /b [10];/* вектор з 10 елементів мають тип double */
int w [3] [3] = {{2, 3, 4},
{3, 4, 8},
{1, 0, 9}};
В останньому прикладі оголошений масив w [3] [3]. Списки, виділені у фігурні дужки, відповідають рядкам масиву, у разі відсутності дужок ініціалізація буде виконана неправильно. p align="justify"> У мові СІ можна використовувати перетину масиву, як і в інших мовах високого рівня (PL1 тощо), однак на викори...