Основні теоретичні відомості

Завдання на лабораторну роботу

Мета роботи

Лабораторна робота № 4 Робота з покажчиками та динамічними масивами

Контрольні питання

1. Що називається масивом?

2. Як описується масив?

3. Що називається індексом масиву?

4. Які обмеження накладаються на індекси?

5. Як відбувається доступ до індексів масиву?

6. Які типи використовуються для вказання розмірність масиву?

7. Що таке матриця?

8. Як відбувається введення значення елементів матриці?


Одержати навики та знання, необхідні для роботи з покажчиками та динамічною пам’яттю.

1. Ознайомитися з теоретичними відомостями даної лабораторної роботи.

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

3. Скласти та виконати на ПЕОМ програми відповідно варіанту.

4. Оформити звіт.

Покажчик - деяке символьне завдання адреси.

В мові С є змінні типа покажчик. Значенням змінної типу покажчик буде адреса деякої величини.

Враховуючи, що для деяких операцій, пов’язаних з покажчиками, потрібно знати об’єм відведеної пам’яті, опис покажчиків має вигляд:

описувач_типу * ім’я-покажчика;

 

Наприклад:

int*pi; /* покажчик на змінну цілого типу */

char *pc; /* покажчик на змінну символьного типу */

З покажчиком використовують два оператори: „*” та „&”. Оператор „&” – унарний. Він повертає адресу пам’яті, де розташований його операнд.

Унарний оператор * дозволяє звернутись до значення змінної, що розташована за адресою, що задана його операндом.

Операції, що виконуються за допомогою покажчиків, часто називають операціями непрямого доступу, т.ч. ми непрямо отримуємо доступ до змінної через деяку іншу змінну.

Працюючи з покажчиком, постійно використовують операцію & – отримання адреси об’єкту. Для неї існують природні обмеження:

– неможливо визначити адресу непоіменованої константи, тобто не приймаються вирази &3.141593;

– неможливо визначити адресу значення, яке отримане при розрахунку скалярних виразів;

– неможливо визначити адресу змінної, що відноситься до класу пам’яті register;

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

Основні типи як завжди визначаються ключовими словами int, float, char, unsigned.

Операції над покажчиками можна сгрупувати наступним чином:

– операції розіменування чи доступу за адресою (*);

– перетворення типів (приведення типів);

– присвоєння;

– отримання (взяття) адреси (&);

– адитивні операції (додавання та віднімання константи);

– інкремент (++) та дикремент (--);

– операції відношення (операції порівняння);

Якщо операція & завжди дає однаковий результат – адрес розміщення в пам’яті, то операція розіменування *покажчик залежить не тільки від адреси, але й від типу. Річ в тому, що при доступі до пам’яті за допомогою розіменування покажчика потрібною буде інформація не тільки про розміщення, але й про розміри ділянки пам’яті, що буде використовуватися. Цю додаткову інформацію компілятор отримує з типу покажчика.

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

Наприклад. Після виконання p1=p1+9 p1 буде посилатися на дев’ятий елемент базового типу покажчика р1 відносно поточного елемента, на який посилається p1.

Додавати покажчики не можна. Але якщо відняти один покажчик з другого (які вказують на один базовий тип) то різниця вкаже на кількість елементів базового типу, що розподіляють ці два покажчика.