Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лаб.работа №1 .doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
103 Кб
Скачать
☆

Динамическое выделение памяти для массивов.

С помощью оператора можно выделять память и для массивов. Вот как выглядит общий формат операции выделения памяти для одномерного массива : Переменная-указатель = new тип_переменной [размер];

Чтобы освободить память, выделенную для динамически созданного массива, используется такой формат оператора delete :

Delete [] переменная_указатель

Следует отметить, что инициализировать динамический массив одновре6менно с выделением памяти нельзя.

Пример 3. Выделить память для 10 элементов массива типа double, который затем заполнить значениями от 1 до 10. Отобразить содержимое массива на экране.

Напомним, что в языке С++ имя массива – это указатель на первый элемент массива, то есть «природа» указателя и имени массива одинакова. Отсюда следует, что указатель можно индексировать, подобно массиву.

#include <iostream>

#define n 10

using namespace std;

void main()

{ double *p_m;

int i;

p_m = new double[n]; // выделяем память для 10-ти элементов массива

for(i=0 ; i<n ; i++) p_m[i] = 1+i; // инициализируем массив

for(i=0 ; i<n ; i++) cout<< p_m[i]<<' '; // выводим массив на экран

delete[] p_m; /* удаляем весь массив

(возвращаем память в «кучу») */

}

Следующий пример показывает, как ту же самую задачу можно решить без использования индексов. Почему следует избегать использования индексов? Дело в том, что при индексировании массива перед обращением к очередному элементу каждый раз вычисляется его адрес, путем прибавления к начальному адресу массива (имени) смещения (индекса). При использовании указателей используются операции инкремент/декремент, которые выполняются значительно быстрее, что и является решающим фактором при обработке больших объемов данных.

В примере 4 для обращения к элементам динамического массива данных используются два указателя – p_beg и p_tek. Оператор new возвращает адрес выделенной области памяти, который записывается в указатель p_beg, этот указатель служит в дальнейшем для хранения этого адреса (начало динамического массива). Для обращения к элементам массива служит «текущий» указатель p_tek.

Пример 4. Работа с динамическим массивом без использования индексов.

#include <iostream>

#define n 10

using namespace std;

void main()

{ double *p_beg,*p_tek;

int i;

// выделяем память для 10-ти элементов массива

p_beg = new double[10];

// устанавливаем «текущий» указатель на начало массива

p_tek=p_beg;

/* цикл для заполнения массива, «текущий» указатель перемещается на следующий элемент массива при каждом проходе цикла */

for(i=1 ; p_tek < p_beg+10 ; p_tek++)

*p_tek = i++;

/* снова устанавливаем «текущий» указатель на начало массива, так как после окончания цикла заполнения массива он указывает на конец массива */

p_tek=p_beg;

while(p_tek < p_beg+10) // цикл для отображения массива

cout << *p_tek++ << ' ';

delete[] p_beg; //возвращаем память в «кучу»

}

Структурный тип данных.

В простейших задачах каждый элемент данных представлен в виде переменной, определенной встроенным типом float, int, char, но при программировании реальных задач приходится иметь дело с объектами, организованными более сложно, в состав которых входит не одна переменная. В этом случае используется структурный тип данных.

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

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

int day; // день

char month[10]; // месяц

int year; // год

Чтобы эти три переменные рассматривались как единое понятие «дата», их требуется объединить в структуру.

Первым шагом в создании взаимосвязанного множества переменных является определение структурного (пользовательского) типа данных. Определение дает структуре имя и указывает компилятору имя и тип каждого элемента (поля) структуры.

Пример: определение нового структурного типа date, состоящего из 3-х полей (элементов):

sruct date

{ int day;

char month[10]; // статический символьный массив

int year;

};

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

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

Определив структуру, можно пользоваться новым структурным типом данных - создавать объекты в памяти - переменные, указатели, массивы, и тому подобное. Название нового типа в нашем примере будет sruct date.

Можно совместить описание структуры и создание переменных (выделение памяти), например:

struct date

{ int day;

char month[10];

int year;

} a, b, c;

При этом выделяется соответствующая память под переменные a,b,c (каждая из переменных содержит по два int-поля и массив из 10 char-элементов ). После того, как новый тип (struct date) введен, его можно использовать для объявления структурных переменных в любом месте программы, например:

…

…

struct date d1;

Переменная d1 имеет тот же тип, что и a,b,c (struct date).

Переменные, подобные a, b, c называют объектами структурного типа или же структурными переменными, но чаще всего - структурами. Из-за этого может возникнуть некоторая терминологическая путаница. Обращаю ваше внимание, на то, что определение структуры – это создание нового типа данных (без выделения памяти), а объявление структуры – это выделение памяти под объект структурного типа.

Примеры использования структурного типа для создания различных объектов:

struct date b; // переменная-структура b

struct date week2[7]; // массив структур week2

struct date *poin_d ; // указатель point_d на структуру date