Динамические массивы
7.1 Одномерные динамические массивы
Объем памяти, выделяемый для обычного массива, определяется на этапе компиляции в соответствии с обязательным указанием размера массива.
Массивы переменной длины создаются в динамической памяти ("куче") и их часто называют динамическими массивами. Куча – это свободная память, место расположения которой зависит от операционной системы, компилятора, модели памяти, для которой создана программа.
Для формирования массивов динамической памяти используются указатели и специальные функции и операторы. В языке Си в заголовочных файлах <stdlib.h> и <alloc.h> описаны функции malloc(), free(), которые предназначены для выделения, изменения и освобождения участков динамической памяти. Они сообщают (возвращают) в программу адрес начала свободного участка памяти (при его наличии) достаточного размера, т.е. они возвращают указатель. Этот указатель обычно (в зависимости от компилятора) имеет тип void*, который нужно преобразовать к типу данных создаваемого массива. После использования память освобождается.
Синтаксис следующий:
int n; scanf("%d",&n); //число элементов в массиве
тип *имя;
имя=(тип*)malloc(n*sizeof(тип));
if(имя==NULL){puts("Ошибка выделения памяти!");return-1;}
//программа
Free(имя);
Пример. Создать динамический массив для чисел типа int, размер задать с клавиатуры.
#include <stdio.h>
#include <alloc.h>
Int main()
{int n, *ptr;
puts("Введите размер массива");
scanf("%d",&n);
ptr=(int*)malloc(n*sizeof(int));
if(ptr==NULL){puts("Ошибка выделения памяти!");
return -1;}
puts("Введите элементы массива");
for(int i=0;i<n;i++)
scanf("%d",&ptr[i]);
for(i=0;i<n;i++)
printf("%d\n",*(ptr+i));
free(ptr); return 0;}
В этом примере функция malloc() осуществляет запрос у операционной системы n*sizeof(int) байт свободной памяти для размещения массива чисел типа int. При наличии свободной памяти возвращается указатель типа void* на начало выделенного блока памяти, иначе ‑ NULL. Дальше выполняется преобразование типа void* в тип int*. Далее в выделенную память помещаются значения элементов массива, причем, доступ к элементам массива можно осуществлять как с помощью индексов, так и методом разыменования указателей на элементы. В конце выполняется вызов функции free(), которая освобождает выделенную ранее память.
В языке С++ введены специальные операции new, deleteи delete[].Операцию delete[] следует применять, если память выделена под массив, а операцию delete для освобождения памяти, предоставленной для простых переменных.
Синтаксис для одномерного массива такой
int n; scanf("%d",&n); //число элементов в массиве
тип *имя;
имя=new тип[n];//запрос памяти под элементы массива
if(имя==NULL){puts("Ошибка выделения памяти!");return -1;}
//программа
delete[]имя; //освобождение памяти
Пример. Создается динамический массив для чисел типа long, в который записываются случайные числа от 1 до 100, и находится произведение всех чисел. В конце программы память освобождается.
#include <stdio.h>
#include <stdlib.h>
Int main()
{int n,i,j;
long *arr,mul=1L;
puts("Введите размер массива");
scanf("%d",&n);
arr=new long[n];//запрос памяти под элементы массива
if(arr==NULL) {puts("Ошибка выделения памяти!");
return -1;}
randomize(); //запуск генератора случайных чисел
for(i=0;i<n;i++) {*(arr+i)=random(100)+1;
mul*=arr[i];}
for(i=0;i<n;i++)
printf("arr[%d]=%ld\n",i,arr[i]);
printf("mul=%ld\n”, mul);
delete [] arr; //освобождение памяти
Return 0;
}
7.2 Двумерные динамические массивы
Для создания двумерного динамического массива используется указатель на массив указателей.
Синтаксис для создания двумерного массива динамической памяти с помощью функций mallocследующий:
//ввод количества элементов строк n и элементов в строке m
int n,m; scanf("%d%d",&n,&m);
тип **имя; //определение указателя на массив указателей
//запрос памяти для n указателей на строки
имя=(тип**)malloc(n*sizeof(тип*));
if(имя==NULL){puts("Ошибка выделения памяти!");return -1;}
//запрос памяти для m элементов в nстроках
for(int i=0;i<n;i++)
{имя[i]=(тип*)malloc(m*sizeof(тип));
if(имя[i]==NULL){puts("Ошибка выделения памяти!");
free(имя); return -1;}
}
//программа
for(i=0;i<m;i++) free(имя[i]);
Free(имя);
Синтаксис для двумерного массива с использованием операции new и delete такой:
//ввод количества элементов строк n и элементов в строке m
int n, m; scanf("%d%d",&n,&m);
тип **имя; //определение указателя на массив указателей
имя=new тип*[n];//запрос памяти для указателей на строки
if(имя==NULL){puts("Ошибка выделения памяти!");return -1;}
//запрос памяти для элементов в строках
for(int i=0;i<m;i++)
{имя[i]=new тип[n];
if(имя[i]==NULL){puts("Ошибка выделения памяти!");
delete[]имя; return -1;}
}
//программа
for(i=0;i<m;i++) delete имя[i];
delete[]имя; //освобождение памяти
Пример. Создать двумерную матрицу, ввести с клавиатуры количество строк и столбцов, а также ввести с клавиатуры значения элементов и заменить отрицательные элементы нулями.
#include <stdio.h>
Void main()
{int N, M, i, j;
int **ma; //указатель на массив указателей на строки
puts("Введите число строк и столбцов матрицы");
scanf("%d%d",&N,&M);
ma=(int**)malloc(N*sizeof(int*));
//запрос памяти под указатели на строки
//ma=new int*[N}; //для операцииnew – delete
if(ma==NULL){printf("Ошибка выделения памяти!\n");return-1;}
for(i=0;i<N;i++)
{ma[i]=(int*)malloc(M*sizeof(int)); ));
//запрос памяти под элементы в строке
// ma[i]=new int[M]; //для операцииnew – delete
if(ma[i]==NULL)
{printf("Ошибка выделения памяти!\n");
Дата добавления: 2016-04-11; просмотров: 2014;