Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
L_mas-vkaz.doc
Скачиваний:
2
Добавлен:
24.04.2019
Размер:
291.84 Кб
Скачать

12

Міністерство освіти і науки україни Національний університет «Львівська політехніка» Кафедра «Телекомунікації»

Масиви та вказівники

Методичні вказівки до лабораторної роботи з дисципліни

«Інформатика телекомунікаційних систем та мереж, ч.IІ»

для студентів базового напряму 6.0924

«Телекомунікації»

Затверджено

на засіданні кафедри «Телекомунікації»

Національного університету

«Львівська політехніка»,

протокол №___ від______2006р.

Львів 2009

«Масиви та вказівники». Методичні вказівки до лабораторної роботи з дисципліни «Інформатика телекомунікаційних систем та мереж, ч.IІ» для студентів базового напряму 6.0924 «Телекомунікації». Львів 2006. 12 с.

МЕТА РОБОТИ: дослідити та навчитися програмувати на мові C з використанням масивів та змінних типу вказівник. Зрозуміти взаємозв’язок між масивами та вказівниками.

Попередні відомості

Масив дозволяє зберігати як єдине ціле послідовність змінних однакового типу. Оголошенння масиву визначає тип елементів масиву та його ім’я. Вона може визначати також кількість елементів в ма­сиві. Змінна типу масив бере участь у виразах як константа-вка­зівник на значення заданого специфікацією типу. Якщо специфікацію типу опущено, вважається тип int.

Декларац·я масиву може мати одну з таких форм:

[<тип>] <ім’я> [<константний вираз>];

[<тип>] <ім’я> [];

[<тип>] <ім’я> [<конст.вираз1>][<конст.вираз2>]...; - для багатомірних масивів.

Квадратні дужки після імені обов’язково· є ознакою ти­пу масив. Тип може бути будь-яким, крім функції void. Таким чи­ном, елементи масиву можуть мати базовий, перечислюваний, струк­турний тип, бути об’єднанням, вказівником, або, в свою чергу, ма­сивом. Константний вираз у кадратних дужках визначає кількість елементів у масиві. Індексація елементів масиву починається з ну­ля. Тобто індекс останнього елементу масиву на одиницю менший, ніж кількість елементів у масиві.

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

Масиву виділяється пам’ять, яка необхідна для розміщення всіх його елементів. Елементи масиву з першого до останнього розміщені послідовно в комірках пам’яті за зростанням адрес. Між елемента­ми масиву в пам’яті розриви відсутні. Елементи багатомірного ма­сиву заповнюються рядками, і при такому способі зберігання ос­танній індекс масиву змінюється найшвидше.

Для доступу до окремого елементу масиву використовується ін­дексний вираз, який обчислюється шляхом додавання до адреси маси­ву цілого числа і отримання значення за новою адресою. Наприклад, індексний вираз line[0] є значенням першого елементу ма­сиву, а line[5] отримує шостий елемент масиву. Для багатовимірних масивів індексний вираз обчислюється зліва направо. Багатовимірний масив інтерпретується мовою С як масив, елементами якого є маси­ви. Наприклад, елементами трьохмірного масиву є двомірні масиви, і декларація:

int prop[3][4][6];

означає, що масив з іменем prop містить 3 елементи, кожен з яких є двомірним масивом.

Ініціалізація дозволяється тільки для масивів, декларованих зовнішніми або статичними. Приклади:

1) static int masiv1 [] = 0,1,2,3,4,5 ;

тут розм·р масиву не вказаний, але комп·лятор сам визначить його за кількістю· ініційованих елементів;

2) static float mas11 [6] = 1.,1.,1.,2.,2.,2. ;

тут вказаний розмір масиву 6 і компілятор при ініціалізації пере­вірить, чи кількість ініційованих елементів не перевищує вказану розмірність, а якщо перевищує, видасть повідомлення про помилку;

3) int mas12 [7] = 7,6,5 ; /* на глобальному рівні */

тут розмір масиву 7 і компілятор здійснить ініціалізацію перших трьох елементів відповідними величинами, а решта чотири автома­тично ініціює нулями;

4) int mas25 [2][5] = /* на глобальному рівні */

0,1,2,3,4 ,

5,6,7,8,9

;

тут задаються два рядки по п’ять цілих чисел.

Дуже важливим прикладом масиву в мові С є рядок string, який представляється одновимірним масивом типу char, тобто послідовністю символів, наприклад:

static char mlit[] = "Добрий день!";

тут компілятор визначає кількість потрібних комірок пам’яті авто­матично і виділяє 13 байтів - 12 під видимі символи і тринадцятий під невидимий символ кінця рядка ('\0').

Під символьний масив завжди слід виділяти на одну ко­мірку пам’яті більше, ніж довжина рядка.

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

[< тип >] * <ім’я>

Специфікація типу може задавати базовий тип, перечислюваний, порожний, структурний або тип об’єднання, масив, функцію, вказівник. Якщо специфікацію типу опущено, вважається тип int. Вказ·вники типу void можуть вказувати на значення будь-якого типу, однак для виконання операцій над вказівником типу void, необхідно явно при­вести тип вказівника до типу, що відрізняється від типу void.

Змінна, оголошена як вказівник, зберігає адресу пам’яті. Розмір пам’яті, що необхідний для зберігання адреси, та формат цієї адреси залежить від типу комп’ютера і від реалізації компілятора, а також від обраної моделі пам’яті. Модифікатори near, far, huge також специфікують формат вказівника. Приклад:

int *ptr;

змінна ptr декларована як вказ·вник на величину типу int, тобто в комірці пам’яті з іменем ptr зберігатиметься адреса цілого числа типу int.

Вказівник на структуру, об’єднання або перечислюваний тип використовує тег (вид) структури, об’єднання або перечислюваного типу. Константа NULL, визначена в стандартному файлі <stdio.h>, призначена для ініціалізації вказівників, при цьому гарантується, що жоден програмний продукт не буде мати адресу NULL.

За виглядом оголошення вказівника символом * перед іменем змінної подібна на оператор визначення величини *, яка зберігаєть­ся в комірці, на адресу якої вказує вказівник. Існує також опера­тор &, який повертає адресу операнда. Приклад:

int *ptr; /* змінна ptr - вказівник на int */

int it = 33;

ptr = &it; /* змінн·й ptr присвоюється адреса it */

*ptr = *ptr + 1; /* змінній it присвоюється 34 */

Ім’я масиву є вказівником на перший елемент масиву, тобто містить його адресу. Це ім’я є константою і над ним не дозволяються арифметичні операції (щоб не можна було змінюва­ти в пам’яті позицію розміщення початку масиву). Наприклад, якщо оголошено масив m3[], то вираз ++m3 , буде некоректним через спробу змінити значення m3. Для доступу до решти елементів масиву використовуються індексні вирази, (наприклад, m3+1), в яких зас­тосовується адресна арифметика. Номер елементу масиву, до якого необхідно отримати доступ, є цілим числом. До значення вказівни­ка, який є іменем масиву та містить адресу розміщення його першого елементу, додається ціле число, яке є добутком но­мера елемента масиву на розмір (у байтах) типу елементів, і таким чином обчислюється адреса в пам’яті шуканого елементу. Адресна арифметика застосовується в усіх арифметичних виразах щодо вка­зівників. Так, збільшення вказівника на одиницю означає зсув в пам’яті на кількість байтів, відповідного типу, на який він вказує.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]