Структурированные типы данных. Массивы
Массив – это структура данных с фиксированным и упорядоченным набором однотипных элементов (компонентов).
Описать массив в C++ можно так:
Тип имя_массива [размерность];
Размерность — это количество элементов в массиве. Например:
float a[20]; // описание массива из 20 вещественных чисел
Размерность массива и тип его элементов определяют объем памяти, который необходим для хранения массива, поэтому размерность — это целое положительное константное выражение.
const int n=15; // определенна целая положительная константа
double B[n]; // описан массив из 15 вещественных чисел
Доступ к какому-либо из элементов массива осуществляется по имени и номеру (индексу) этого элемента. Количество индексов определяет мерность массива, так например чаще всего встречаются одномерные (вектора) и двумерные массивы (матрицы).
Для доступа к данным, хранящимся в определенном элементе одномерного массива, необходимо указать имя массива и в квадратных скобках порядковый номер этого элемента, называемый индексом. Элементы массива нумеруются поочередно, начиная с 0.
имя_массива [индекс];
Например: int x[10]; // описание массива из 10 целых чисел, нумерация от 0 до 9
Когда возникает необходимость хранения данных в виде таблиц, в формате строк и столбцов, то придется использовать двумерные массивы. Строки в нем считаются первым измерением, а столбцы вторым. Для доступа к данным, хранящимся в этом массиве, необходимо указать имя массива и два индекса: первый должен соответствовать номеру, а второй номеру столбца, в котором хранится необходимый элемент.
имя_массива [строка] [столец];
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Массиву, как и любой другой переменной, можно присвоить начальное значение. Для этого значения элементов массива нужно перечислить в фигурных скобках через запятую:
тип имя_переменной [размерность] = {элемент_0, элемент_1, …};
Например:
float a[6] = {1.23, 2.4, 5.6, 6.1};
//формируется массив из шести вещественных чисел,
//значения элементам присваиваются по порядку,
//элементы, значения которых не указаны обнуляются:
//a[0]=1.23, a[1]=2.4, a[2]=5.6, a[3]=6.1, a[4]=0, a[5]=0
Ввод и вывод элементов массива осуществляется поэлементно.
Структурированные типы данных. Динамические массивы.
Динамический массив — массив переменной длины, память под который выделяется в процессе выполнения программы.
Реализация простого динамического массива основывается на следующих манипуляциях. Выделяется массив фиксированного размера. Он делиться на две части: первая хранит элементы динамического массива, а вторая является резервным пространством, которое, по мере необходимости, может быть задействовано. Такая организация, позволяет добавлять элементы в конец динамического массива, а также удалять их, причем делать это за константное время. Если массив заполнен полностью (заполнены обе части исходного массива), то говорят, что исчерпан физический размер; количество элементов, используемых для динамического содержимого массива, называют логическим размером.
Для работы с дин.мас-и имеются встроенные операторы или функции.
операторы new и delete
Пример создания и очистки целочисленного динамического массива, состоящего из 10 элементов:
float *A=new int[10]; //создание
// Выделено столько памяти, сколько необходимо для хранения 10 величин типа int.
delete []A; //удаление
функции malloc, calloc, realloc и free;
Пример создания и очистки целочисленного динамического массива, состоящего из 10 элементов:
int *A = malloc(sizeof(int) *10); //создание
free(A); //удаление
Адрес первого элемента выделенного участка памяти хранится в переменной, объявленной как указатель.
Фактически, в переменной A хранится адрес нулевого элемента динамического массива. Следовательно, адрес следующего, первого элемента, в выделенном участке памяти - A+1, а A+i является адресом i-го элемента. Обращение к i-му элементу динамического массива можно выполнить, как обычно A[i], или другим способом *(A +i). Важно следить за тем, чтобы не выйти за границы выделенного участка памяти.
Обычный статический массив выигрывает у динамического в быстродействии, что компенсируется расширенным функционалом последнего.
