Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга6.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.45 Mб
Скачать

6.3 Масиви

Покажчики та масиви тісно пов'язані один з одним. Якщо ptr – деякий покажчик, ptr ++ збільшує його значення і він вказує на наступний. Значення ptr використовується у виразі, а потім збільшується. Аналогічно визначаються операції ptr --, ++ ptr, -- ptr. Покажчик ptr можна складати з цілим числом i. Оператор ptr ++ = i пересуває посилання на i елементів щодо поточного значення. Ці конструкції підпорядковуються правилам адресної арифметики.

На рис. 6.6 представлено шість комірок, розміром по 4 байта. Нехай покажчик р на перший елемент масиву має адресу зміщення в пам’яті 1000 байт і вказує на записані дані, тобто 0,67. Використавши інкрементування р ++ ми переходимо до наступного елемента в масиві (і зміщуємось в пам’яті на розмір типу – 4байта). Покажчик уже вказує на 2,56 з адресою 1004.

Обмежень по переміщенню в масиві немає, тому потрібно бути обережним.

При переміщенні покажчика за межі масиву(операціями р ++ чи р --), він вказуватиме на значення типу float, де знаходитиметься якийсь випадковий набір нулів та одиниць, що використовуватимуть правила переведення з двійкової системи в десяткову з плаваючою точкою, для відображення змісту.

Рисунок 6.6 – Адресна арифметика

На рис. 6.7 представлено зміщення покажчика для інших типів : int(зміщення 4 байти), double(зміщення 8 байтів), long(зміщення 4 байти), unsigned int(зміщення 4 байти).

Нехай є опис int a [5]. Він визначає масив розміром 5 елементів, тобто п'ять послідовних розташованих комірок пам'яті a [0], a [1], a [2], a [3], a [4]. Адреса i-го елемента масиву дорівнює сумі адреси початкового елемента масиву та зміщення цього елемента на i одиниць від початку масиву. Це досягається шляхом індексації: a [i] – i-й елемент масиву. Більш ефективно доступ до будь-якого елементу масиву може бути виконаний за допомогою покажчиків. Якщо ptr покажчик на ціле, описаний як ptr*, то ptr після виконання операції ptr = &a[0] – містить адресу a [0], а ptr ++ i вказує на i-й елемент масиву. Таким чином, ptr++ i є адреса a [i]. Оскільки ім'я масиву в програмі ототожнюється з адресою його першого елемента, то вираз ptr = &a [0] еквівалентно такому: ptr = a. Тому значення a [i] можна записати як * (a+i). Застосувавши операцію взяття адреси, отримаємо що &a[i] та a+i ідентичні.

Рисунок 6.7 – Зміщення покажчика для різних типів даних

На рис. 6.8 наведено текст програми з функцією zamina (x, y), яка міняє місцями значення двох цілих величин. Так як x, y – адреси змінних a і b, то * x і * y забезпечують непрямий доступ значенням a і b. На схемі представлено суцільними лініями хід роботи програми, пунктиром – обмін даних.

Приклад 6.7. Заміна місцями значення двох цілих величин (рис. 6.8)

#include <stdio.h>

void zamina (int *x, int *y){

int t;

t =*x;

*x =*y;

*y = t;

}

int main () {

int a, b;

a = 3; b = 7;

zamina (&a, & b);

printf ("a =% d b =% d", a, b);

}

Приклад 6.8. Збільшення поточного значення покажчика на одиницю.

int length (char * s) { /* довжина рядка */

int i;

for (i = 0; * s! = '\ 0'; s + +)

i + +;

return i;}

Рисунок 6.8 – Заміна місцями значення двох цілих величин

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