Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

5.2. Динамические массивы

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

int array[10];

происходит следующее. Программа резервирует 10 смежных ячеек памяти, по 4 байта в каждой ячейке. Именно такое количество байтов необходимо для хранения числа типа int. Кроме того, компьютер запоминает адрес первого элемента массива array[0]. Этот адрес, как мы увидим позже, хранится в указателе, которым является имя массива. Адреса всех остальных элементов не запоминаются, а вычисляются относительно адреса array[0]. То есть

адрес второго элемента =адресу первого элемента +4,

адрес третьего элемента =адресу первого элемента +2*4,

и т.д.

Все это говорит о том, что имя массива, на самом деле, представляет собой переменную указатель, которая указывает на первый элемент массива array[0]. Чтобы убедиться в этом рассмотрим маленькую программу.

#include <iostream>

using namespace std;

typedef int* pointer; /*определение типа, т.е. далее указатель типа int можно объявлять как тип pointer*/

int main(){

Int array[10]; //объявляется массив с именем array

pointer point; //объявление указателя соответствующего типа

for(int i=0; i<10; i++){

array[i]=i; //заполнение массива целыми числами

cout<< array[i];

}

cout<<"\n";

point=array; //Значение одного указателя присваивается другому

for(int i=0; i<10; i++)

cout<< point[i];

return 0;

}

В результате выполнения программы получим следующее

0123456789

0123456789

После присвоения значения одного указателя другому, point указывает на тоже место в памяти, что и array. Значит point можно рассматривать как идентификатор массива, а array как указатель, что и подтверждают результаты выполнения программы.

Вот еще интересный пример, это фрагмент программы:

Int a[10]; //объявляется массив с именем a

int i;

for (i=0; i<10; i++) {

a[i] = i; //в массив записываются числа по порядку

cout<<i[a]; //выводятся элементы несуществующего массива

}

Вот результат

Этот пример говорит о том, что для С++ массивы a[i] и i[a] – это одно и тоже Точнее для С++ идентификаторы a[i] и i[a] это адреса, которые вычисляются как сумма адресов – адреса первой ячейки массива a и адреса сдвига i.

Теперь, наконец, обратимся к динамическим массивам. Динамические массивы создаются с помощью оператора new . Рассмотрим несколько примеров

//пример массива типа int

Int *array1; //указатель типа int с именем array1

array1=new int[10]; /* просим дать свободный адрес для

* массива из 10-ти элементов типа.

* int, т.к объявление размера массива

* должно быть проведено до его

* использования в программе */

// пример массива типа double

double *array2;

array2=new double[10];

// пример массива типа char

typeof char* dinamicArray;

dinamicArray array3;

array3=new char[10];

Вот пример программы в которой используются эти массивы.

#include <iostream>

# include<windows.h>

using namespace std;

int main(){

int n;

SetConsoleOutputCP(1251);

cout<<”Размер массива=”;

cin>>n;

int *array1;

array1=new int[n+2]; //создание массива int

for(int i=0; i<n+2; i++){ //цикл для заполнения массива

array1[i]=i; //заполнение массива целыми числами

cout<< array1[i];

}

cout<<endl;

double *array2;

array2=new double[n]; //создание массива double

for(int i=n-1; i>=0; i--){

array1[i]=i+0.0;

cout<< array1[i];

}

cout<<endl;

typedef char* dinamicArray;

dinamicArray array3=new char[n]; // объявление с

// инициализацией

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

array1[i]=i;

cout<< array1[i];

}}

А вот результаты выполнения программы:

Многомерный массив в С++ рассматривается как массив массивов. Например,

int array[3][4][5];

можно рассматривать как массив из трех элементов, каждый из которых представляет собой двумерный массив 4×5. В памяти элементы массива размещаются в порядке возрастания правого индекса.

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

int **a=new int*[r]; //r- количество строк

Каждый из указателей, входящий в массив, является указателем на строку двумерного массива.

Далее организуется цикл для выделения памяти под каждую строку массива

for(int i=0; i<r;i++)

каждому элементу массива указателей на строки присваевается адрес начала участка памяти, выделенного под строку двумерного массива

a[i]=new int[c]; // с- количество столбцов

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

#include <iostream.h>

#include <windows.h>

int main(int argc, char* argv[])

{

int n = 0; //Количество строк

int m = 0; //Количество столбцов

SetConsoleOutputCP(1251);

cout << "Введите n: ";

cin >> n;

cout << " Введите m: ";

cin >> m;

//Создаем массив указателей

int** arr=new int*[n];

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

arr[i]=new int[m];

//Заполняем массив

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

{

for (int j=0; j<m; ++j)

{

cout<<"arr["<<i<<"]["<<j<<"]=";

cin>>arr[i][j];

}

}

//Поиск отрицательных чисел в столбце

cout << "В столбце:\n";

//в следующем цикле объявлены 2 переменные !

for (int i=0, index=-1; i<m; ++i)

{

for (int j=0; j<n; ++j)

if(arr[j][i]<0) index=j;

if (index !=- 1) cout<<i<<") "<<index<<endl;

}

cout << "В строке:\n";

for (int i = 0, index=-1; i<m; ++i)

{

for (int j = 0; j<n; ++j)

if (arr[i][j]<0) index=j;

if (index != - 1) cout<<i<<") "<<index<<endl;

}

//Удаляем массив

//сначала удаляются указатели на столбцы

for (int i=0; i<n; ++i) delete [] arr[i];

//потом указатели на строки

delete [] arr;

_flushall(); //очистка всех буферов

char z;

cin>>z;return 0;

}

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