Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вказівники та посилання.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
857.42 Кб
Скачать

Int а[3][4]; /* а - вказівник-константа */

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

Після цього покажчик р можна використовувати замість покажчика а для звертання до рядків або елементів масиву а у вигляді: ім'я покажчика і зсув елемента щодо адреси початку масиву а.

В ОП елементи масиву а розташовуються таким чином, що швидше всіх змінюється самий правий індекс, тобто в послідовності:

а[0][0] а[0][1] а[0][2] а[0][3] а[1][0] ... а[2][2] а[2][3].

При цьому для звертання до масиву а можна використовувати імена:

&a == а == &а[0][0] == *а

адреса а[0] [0] - елемента 0-ого рядка 0-ого стовпця масиву а;

**а == *(&а[0][0]) == а[0][0]

значення елемента нульового рядка нульового стовпця масиву а;

a[i] == (а + i) == *(а + i) == &а^] [0]

адреса елемента і-рядка 0-стовпця;

*a[i] == **(а + i) == М&а^]) == a[i][0]

значення 0-го елемента і-рядка;

a[i][j] == *(*(а + i) + j) == *(a[i] + j) == a[i][j]

значення елемента і-рядка j-стовпця масиву а;

де:

(а + i) == *(а + i) == a[i]

адреса 0-го елемента і-рядка == &а[і][0];

(*(а + i) + j)

адреса j-елемента і-рядка = &а[і] [j];

*(*(а + i) + j)

значення j-елемента і-рядка = а[і] [j].

Значення адреси початку і-рядка (адреси 0-елемента і-рядка) на машинному рівні формується у виді:

a[i] = а + i == (a+i*n*sizeof(int)) , де n - кількість значень в одному рядку.

Таким чином, адреса (і+1)-рядка відстоїть від і-рядка на (n*sizeof(int)) байтів, тобто на відстань одного рядка масиву.

Вираз а[і] [j] компілятор Сі переводить в еквівалентний вираз:

*(*а + і) + j). Зрозуміло, запис а[і] [j] більш традиційний у математиці і більш наочний.

До елементів двовимірного масиву можна звернутися і за допомогою скалярного покажчика на масив. Наприклад, після оголошення:

int a[m][n], *р = а;

* (p+i*n+j) - значення j - елемента i-рядка ; де: n - кількість елементів у рядку;

i*n + j - змішання а[і] [j] - елемента відносно початку масиву а.

10 Масиви покажчиків

За допомогою масивів покажчиків можна формувати великі масиви і вільні масиви - колекції масивів будь-яких типів.

10.1 Робота з великими масивами

Розмір одного масиву даних повинний бути не більше 64 Кб. Але в реальних задачах можуть використовуватися масиви, що вимагають ОП, більшої ніж 64 Кб. Наприклад, масив даних типу float з 300 рядків і 200 стовпців потребує для розміщення 300 * 200 * 4 = 240000 байтів.

Для вирішення поставленої задачі можна використовувати масив покажчиків і динамічне виділення ОП для кожного рядка матриці. Рядок матриці не повинен перевищувати 64 Кб. У вищенаведеному прикладі ОП для рядка складає всього 800 байтів. Для виділення ОП з купи кожен рядок повинний мати покажчик. Для всіх рядків масиву треба оголосити масив покажчиків, по одному для кожного рядка. Потім кожному рядку масиву виділити ОП, привласнивши кожному елементу масиву покажчиків адресу початку розміщення рядка в ОП, і заповнити цей масив.

У запропонованому лістингу представлена програма для роботи з великим масивом цілих значень: з 300 рядків і 200 стовпців. Для розміщення він вимагає: 200 * 300 * 2 = 120000 байтів. При формуванні великого масиву використовується р - статичний масив вказівників

При виконанні програми перебираються /'-номери рядків масиву. Для кожного рядка за допомогою функції malloc() виконується запит ОП з купи і формується p[i] - значення вказівника на дані і-рядки. Потім перебираються і-номери рядків від 1 до 200. Для кожного рядка перебираються j-номери стовпчиків від 1 до 300. Для кожного і та j за допомогою генератора випадкових чисел формуються і виводяться *(р[і] + j) - значення елементів масиву. Після обробки масиву за допомогою функції ггее(р[і]) звільняється ОП виділена і-рядку масиву.

У наведеній нижче програмі використовуються звертання до Лц- -елементів масиву у вигляді: *(p[i]+j), де р[і] +j - адреса Лц-елемента масиву.

#include <conio.h>

#include <stdlib.h>

#include <stdio.h>