Лекция 10_Динамические_массивы.ppt
- Количество слайдов: 26
Лекция 10. Динамические массивы.
План. Одномерные динамические массивы 1. • • • Массивы указателей Двумерные динамические массивы. 2. 3. • • 2 Объявление Создание Обращение к элементам массива • Объявление Создание Обращение к элементам массива
Понятие динамического массива Определение Динамический массив – последовательность однотипных элементов, имеющих общее имя, доступ к которым осуществляется по индексу, размерность которого определяется в процессе работы программы. 3
Особенности динамических массивов 1. Количество элементов при объявлении неизвестно. 2. Память для массива выделяется на этапе выполнения программы, объём памяти определяется программистом. 3. Массив реализуется через систему указателей 4
Создание динамического массива 1. 2. 3. 4. 5 Объявление указателя нужного типа Выделение памяти для необходимого количества элементов (оператор new). Обработка массива Освобождение памяти (оператор delete)
Одномерные динамические массивы. Объявление указателя на массив. базовый_тип * имя_массива; Выделение памяти для динамического массива: имя_массива = new базовый_тип [колво_элементов] 6
Обращение к элементу массива (в общем случае) К элементу массива любого типа (статического или динамического) можно обратиться: - через индекс; - используя имя массива как указатель на его первый элемент (адресная арифметика). 7
Примеры 8 int p 1[80], *p 2, n=10; p 2 = new int [n]; Указателю p 2 присвоен адрес первого байта блока памяти, выделенного для 10 -ти целых чисел. Доступ к элементу массивов можно организовать двумя способами: k = p 1 [4]; k=p 2[5]; //доступ через индекс или k = * (p 1 + 4); //доступ через указатель (имя массива) k = * (p 2 + 5)
9
Пример: сортировка динамического массива методом «пузырька» int main (){ int *massiv; // указатель на исходный массив int n; //переменные для количества элементов int tmp; // вспомогательная переменная //заполнение массива и его вывод на экран srand(time (NULL)); cout<<“enter number of elemets of massiv”<
11 for (int i=0; i
12 //вывод на экран результата for (int i=0; i<10; i++) cout<
Пример. Реверс массива (динамический массив) 13 #include
{ *(a+j)=j+1; printf("%3 d", *(a+j)); 14 } invert(a, n); printf("n. After reverse: n"); for(int j=0; j
void invert (int *a, int n) //передача массива в функцию { for(int j=0, tmp; j
Массивы указателей Синтаксис: Тип_указателей *имя_массива [размер]; 16 Пример. int *points[10]; //объявление массива из 10 //целочисленных указателей points[2] = &n; //присвоить третьему элементу массива //адрес переменной n N = *points[3]; //присвоить переменной n значение, //находящееся по адресу, хранимому в //четвертом элементе массива.
17 При передаче в функцию массива указателей достаточно указать имя массива в качестве параметра. Пример void print_array (int *q[ ]) { int t; for (t = 0; t<10; t++) cout<<*q[t]; } q – указатель на массив целочисленных указателей.
Двумерные динамические массивы Представляют собой сложную конструкцию и реализуются через вспомогательный массив указателей 18
Двумерные динамические массивы 19 Объявление динамического двумерного массива int **a; Выделение памяти под массив указателей a=new int * [n]; Выделение памяти под i-ю строку массива a[i]=new int [n]; Алгоритм работы с динамическим двумерным массивом более громоздкий, чем с одномерным.
Пример. Сложение квадратных матриц 20 void main () { int **a, **b, **c; //объявление указателей int n; cout<<”введите размер матрицы”<
21 for (int i=0; i<=n; i++) { a[i]=new int [n]; /*выделение памяти под i-ю строку массива*/ b[i]=new int [n]; c[i]=new int [n]; } FILE *f; f=fopen(“input. txt”, ”r”);
for (int i=0; i<=n; i++) for (int j=0; j<=n; j++) fscanf(f, “%d”, &a[ i ][ j ]); 22 for (int i=0; i<=n; i++) for (int j=0; j<=n; j++) { fscanf(f, “%d”, &b[ i ][ j ]); c[ i ][ j ]=a[ i ][ j ]+b[ i ][ j ]; }
for (int i=0; i<=n; i++) { for (int j=0; j<=n; j++) printf(“%5 d”, c[ i ][ j ]); printf(“n”); } 23
for (i=0; i<=n; i++) { delete [] a[i]; //освобождение памяти для i-ой строки delete [] b[i]; delete [] c[i]; } 24
delete [] a; //освобождение памяти массива указателей delete [] b; delete [] c; _getch(); } 25
Самостоятельно Написать программу, определяющую имеет ли матрица диагональное преобладание, используя динамические массивы 26


