Пример выполнения задания




Лабораторная работа №3.7.

Обработка двухмерных динамических массивов

Цель работы: изучить понятие «указатель», правила создания и приемы обработки динамических массивов на примере двухмерного массива.

Краткие теоретические сведения

Особенности Применения Указателей

Обращение к объектам любого типа в языке C может проводиться по имени, как мы до сих пор делали, и по указателю (косвенная адресация).

 

Указатель – это переменная, которая может содержать адрес некоторого объекта в памяти компьютера, например, адрес другой переменной.

 

Через указатель, установленный на переменную, можно обращаться к участку оперативной памяти (ОП), отведенной компилятором под ее значение.

 

Указатель объявляется следующим образом:

 

тип * ID указателя;

 

Перед использованием указатель должен быть инициирован либо конкретным адресом, либо значением NULL (0) – отсутствие указателя.

С указателями связаны две унарные операции: & и *. Операция & означает «взять адрес», а операция разадресации * – «значение, расположенное по адресу», например:

 

int x, *y; // х – переменная типа int, у – указатель типа int

y = &x; // y – адрес переменной x

*y = 1; // по адресу y записать 1, в результате x = 1

 

При работе с указателями можно использовать операции сложения, вычитания и сравнения, причем выполняются они в единицах того типа, на который установлен указатель.

 

Операции сложения, вычитания и сравнения (больше/меньше) имеют смысл только для последовательно расположенных данных – массивов. Операции сравнения «==» и «!=» имеют смысл для любых указателей, т.е. если два указателя равны между собой, то они указывают на одну и ту же переменную.

 

Связь Указателей С Массивами

 

Указатели и массивы тесно связаны между собой. Идентификатор массива является указателем на его первый элемент, т.е. для массива int a[10] выражения a и a[0] имеют одинаковые значения, т.к. адрес первого (с индексом 0) элемента массива – это адрес начала размещения его элементов в ОП.

 

Пусть объявлены – массив из 10 элементов и указатель типа double: double a[10], *p; если p = a; (установить указатель p на начало массива a), то следующие обращения: a[i], *(a+i) и *(p+i) эквивалентны,…

 

Указатели На Указатели

Связь указателей и массивов с одним измерением справедлива и для массивов с бóльшим числом измерений.

 

Если рассматривать предыдущий массив (int a[2][3];) как массив двух массивов размерностью по три элемента каждый, то обращению к элементу а[i][j] соответствует эквивалентное выражение *(*(а+i)+j), а объявление этого массива с использованием указателей будет иметь вид

 

int **а;

 

Таким образом, имя двухмерного массива – ID указателя на указатель.

Динамическое Размещение Данных

Для создания массивов с переменной размерностью используется динамическое размещение данных, декларируемых указателями.

 

Для работы с динамической памятью используются стандартные функции библиотеки alloc.h:

 

void *malloc(size) и void *calloc(n, size) – выделяют блок памяти размером size и n×size байт соответственно; возвращают указатель на выделенную область, при ошибке – значение NULL;

 

void free(bf); – освобождает ранее выделенную память с адресом bf.

 

Другим, более предпочтительным подходом к динамическому распределению памяти является использование операций языка С++ new и delete.

 

Операция new возвращает адрес ОП, отведенный под динамически размещенный объект, при ошибке – NULL, а операция delete освобождает память.

 

Минимальный набор действий, необходимых для динамического размещения одномерного массива действительных чисел размером n:

double *а;... а = new double[n]; // Захват памяти для n элементов

...

delete []а; // Освобождение памяти

 

Минимальный набор действий, необходимых для динамического размещения двухмерного массива действительных чисел размером n×m:

 

int i, n, m; // n, m – размеры массива

double **a;

a = new double *[n]; // Захват памяти под указатели

for(i=0; i<n; i++)

a[i] = new double [m]; // и под элементы

...

for(i=0; i<n; i++) delete []a[i]; // Освобождение памяти

delete []a;

Пример выполнения задания

Рассчитать значения вектора , где А – квадратная матрица размером N ´ N, а Y и B – одномерные массивы размером N. Элементы вектора Y определяются по формуле .



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: