Создание динамических массивов.
При определении массива ему выделяется память. При определении внешнего или статического массива память выделяется в сегменте данных, элементы массива по умолчанию инициализируются нулевыми значениями. При определении автоматического массива память выделяется в сегменте стека В обоих случаях происходит статическое выделение памяти под массив либо в сегменте статических данных, либо в стеке. Это означает, что либо до конца программы, либо до конца блока массивам будут соответствовать участки памяти. Можно выделять память под массив динамически в программе, с помощью соответствующих операторов и также программно освобождать ее по желанию программиста. Рассмотрим этот случай. Объявим указатели (переменные) на объект типа type. Указатели можно связать с массивами - статическим (1) и динамическими (2, 3):
1) type * имя1 = имя уже определенного массива типа type; 2) type* имя2 = new type [количество элементов массива]; 3) type * имя3 = (type *) malloc (количество элементов * sizeof(type)); Проиллюстрируем это на примерах: int n [5] = { 1, 2, 3, 4,5}; //определен статический массив int*pn = n; // присоединение указателя к массиву статической памяти //значение pn - адрес первого элемента массива float*p1 = new float [10]; // динамически выделено 40 байт памяти // значение p1 - адрес первого байта этого участка double*p2 = (double*) malloc (4 * sizeof (double)); // динамически выделено 32 байта памяти, значение p2- адрес первого байта После того как указатель связан с массивом доступ к элементам массива осуществляется следующими способами: 1) имя указателя [индекс элемента] 2) *(имя указателя + индекс элемента) 3) *имя указателя ++ (операция допустима, т.к. указатель – переменная) Пример вывода элементов арифметического массива (производится поэлементно): int A [10] = {7.3, 5.5, 1, … }; for (int i=0, *pA=A; i<10; i++) cout<<*pA++<<'' ''; // что эквивалентно cout << pA[i], или cout << *(pA+i)
|