Понятие о динамических данных. Работа с динамическими массивами презентация

Содержание

Данные (классификация по времени жизни) Статические (глобальные и описанные как static): описываются вне функций или с помощью static; распределяются в памяти на этапе компиляции и существуют все время выполнения программы;

Слайд 1Понятие о динамических данных. Работа с динамическими массивами.
Лекция №4


Слайд 2Данные (классификация по времени жизни)
Статические (глобальные и описанные как static):
описываются

вне функций или с помощью static;
распределяются в памяти на этапе компиляции и существуют все время выполнения программы;
место в памяти – статический сегмент;
доступны в любой точке программы, за исключением подпрограмм, имеющих локальные переменные с тем же именем.

Автоматические:
описываются в функциях (без static);
распределяются в памяти на этапе выполнения (при каждом вызове подпрограммы) и освобождают память при завершении работы программы;
место в памяти – стек функций;
доступны в блоке функции.

Динамические:
описываются не данные, а их адреса (указатели);
распределяются и уничтожаются в памяти на этапе выполнения программы по специальным командам;
место в памяти – динамическая память (англ. куча – heap);
время жизни и область действия указателей определяется как для обычных (статических или автоматических) данных.


Слайд 3Динамическое распределение памяти используется:
когда статической памяти и стека подпрограмм не

хватает для решения задачи;
когда объем требуемой памяти (например, число элементов массива) неизвестен до выполнения программы (вводится или вычисляется);
когда характер задачи требует динамического распределения (данные поступают порциями в процессе выполнения программы, например, в режиме реального времени).

начало

Цепочки, списки


Слайд 4Указатели в Си
Указатель - это специальное данное, которая содержит адрес другого

данного.

Основные операции для работы с указателями:
* - взятие содержимого по адресу (*i - содержимое переменной с адресом i) & - взятие адреса (&a - адрес переменной а).

Описание имеет вид:
тип *имя_указателя;
При описании указателя задается тип значения, на которое он указывает. Примеры описаний: int *i, j, *pointj; int v1, *pointv1=&v1, *p=(int*)200;


Слайд 5
Указатели в Си


Слайд 6Указатели в Си
ВНИМАНИЕ!
нельзя брать содержимое от константы без приведения типа; запись

*200 является некорректной в отличие от *(int*)200;
нельзя брать адрес явной константы (например, некорректна запись &200), в Си адрес явной константы считается недоступным;
нельзя определять адрес выражения.


Слайд 7Указатели в Си
Размер памяти, отводимой под указатель, зависит:
от разрядности адресной шины;


от модели памяти.

Слайд 8Указатели в Си
Операции над указателями:
*
сравнения (=, ==,

!=) - с указателями такого же типа или с NULL;
присваивания - значений указателей того же типа или NULL;
арифметические операции сложения, вычитания (с константой)
инкремента и декремента

Слайд 9Указатели в Си
Результат арифметической операции над указателями зависит не только от

значения операндов, но и от типа, с которым связан указатель.
р=р+k, ⇔ р увеличивается на k*sizeof (тип)

Пример. int *p; double *pp;…//MS DOS p++; /*p увеличилось на 4*/
pp++; /*pp увеличилось на 8*/


Слайд 10Связь массивов с указателями в Си
Одномерные массивы
Имя одномерного массива является указателем-константой,

равной адресу начала массива, т. е. адресу элемента с индексом 0 (первого элемента).

int a[10];
&a[0] эквивалентно a,
a[0] эквивалентно *a,
&a[i] эквивалентно a+i (i=0,1,...9),
a[i] эквивалентно *(a+i).

Слайд 11Связь массивов с указателями в Си


Слайд 12Двумерные массивы
b[i][j] ⇔ *(b[i]+j) ⇔ *(*(b+i)+j);
&b[i][j] ⇔ b[i]+j ⇔ *(b+i)+j


Для любого из трех обозначений элемента двумерного массива программа в кодах получается практически одинаковой по производительности, хотя при использовании арифметики указателей вместо квадратных скобок несколько более короткой.
Хороший стиль программирования предполагает употребление в пределах одной программы одного (из трех) обозначений.

Связь массивов с указателями в Си


Слайд 13Функции Си для распределения и освобождения памяти ()
malloc (англ. memory allocation, выделение памяти): void *malloc(size_t

size); Функция malloc() возвращает указатель на первый байт области памяти размером size (в байтах), которая была выделена из кучи. Если нет достаточного объема памяти, возвращается NULL.
calloc (англ. clear allocation, чистое выделение памяти):
void *calloc(size_t num, size_t size);
Функция calloc выделяет память для хранения num значений, каждое длиной size байт. Каждое значение инициализируется нулем. Если нет достаточного объема памяти, возвращается NULL.
realloc (англ. reallocation, перераспределение памяти).
void *realloc(void *ptr, size_t newsize)
Функция realloc() изменяет величину выделенной памяти, на которую указывает ptr, на новую величину, задаваемую параметром newsize. Величина newsize задается в байтах и может быть больше или меньше оригинала. Возвращается указатель на блок памяти, поскольку может возникнуть необходимость переместить блок при возрастании его размера. В таком случае содержимое старого блока копируется в новый блок и информация не теряется. Если свободной памяти недостаточно для выделения в куче блока размером newsize, то возвращается NULL.
free (англ. free, освободить)
void free( void * ptr );
Функция free возвращает в кучу блок памяти, на который указывает ptr. Этот блорк ранее должен быть выделен с помощью вызова malloc, calloc или realloc.


Слайд 14Операции Си++ для распределения и освобождения памяти
Операция new:
указатель=new тип;

Указатель должен быть объявлен с помощью тип*.
Операция выделяет ячейку памяти заданного типа и и присваивает значение адреса ячейки указателю. После типа в круглых скобках можно указать инициализирующее значение, а в квадратных – количество выделяемых ячеек. В большинстве реализаций одновременно круглые и квадратные скобки не допускаются.
Примеры:
int *ip = new int; /* создание объекта типа int и получение указателя на него */
int *ip2 = new int(2); // то же с установкой начального значения 2
inr *intArray = new int [ 10 ]; // массив из 10 элементов типа int double
int **matr = new double [ m ] [ n ]; // матрица из m строк и n столбцов
Операция delete:
delete указатель;
delete [] указатель;//для массивов
Освобождение памяти, выделенной с помощью delete.

Слайд 15Почему неудобны статические (или локальные) массивы?
Основной трудностью работы со статическими массивами

является обязательность указания количества их элементов при объявлении. В любом алгоритмическом языке, требующим компиляции (в частности, в Си, Паскале, Фортране), границами индексов массива при описании могут быть только константы.
Выход – использование динамических массивов.

Слайд 16Пример 1. Ввод и вывод динамического одномерного массива, размер которого n

задается вводом

#include
#include
#include

void main()
{ int *a, n, i;
cout<<"Input the number of elements\n";
cin>>n;
a=(int*)malloc(n*sizeof(int));
//распред-ие памяти под динамический массив
cout<<"Input elements\n";
for (i=0;i cin>>a[i];//*(a+i)

for (i=0;i a[i]=a[i]*a[i];

cout<<"Squares of elements:\n";
for (i=0;i cout< cout< _getch();
free(a);
}

#include
#include

void main()
{int *a, n, i;
cout<<"Input the number of elements\n";
cin>>n;
a=new int[n];
//распред-ие памяти под динамич. массив
cout<<"Input elements\n";
for (i=0;i cin>>a[i];//*(a+i)

for (i=0;i a[i]=a[i]*a[i];

cout<<"Squares of elements:\n";
for (i=0;i cout< cout< _getch();
delete [] (a);
}


Слайд 17Пример 2. Динамические матрицы
#include
#include
#include
void main()
{ int **a, n,m,

i,j; //n-число строк, m-число столбцов;
cout<<"Input n,m\n";
cin>>n>>m;
a=(int**)malloc(n*sizeof(int*));
cout<<"Input matrix\n";
for (i=0;i {
a[i]=(int*)malloc(m*sizeof(int));
for (j=0;j cin>>a[i][j];//*(*(a+i)+j)
}
for (i=0;i for (j=0;j a[i][j]=2*a[i][j];
cout<<"The changed matrix:\n";
for (i=0;i {for(j=0;j cout< cout< free (a[i]);
}
_getch();
free(a);
}

#include
#include
void main()
{ int **a, n,m, i,j;
cout<<"Input n,m\n";
cin>>n>>m;
a=new int*[n];
cout<<"Input matrix\n";
for (i=0;i {a[i]=new int[m];
for (j=0;j cin>>a[i][j];//*(*(a+i)+j)
}
for (i=0;i for (j=0;j a[i][j]=2*a[i][j];
cout<<"The changed matrix:\n";
for (i=0;i { for(j=0;j cout< cout< delete [] (a[i]);
}
delete [] a;
_getch();
}

можно сделать строки матрицы разной длины - ввод m в цикле


Слайд 18Пример 3. Параметры функций типа тип**
#include
#include
float sum(float **a, int

n, int m);
void main()
{ float **a; int n,m, i,j;
cout<<"Input n,m"< cin>>n>>m;
a=new float*[n];
for (i=0;i { a[i]=new float[m];
for (j=0;j cin>>a[i][j];
}
cout<<"sum="< _getch();
for (i=0;i delete [] a[i];
delete [] a;
}

float sum(float **a, int n, int m)
{
float s; int i,j;
s=0;
for (i=0;i for(j=0;j s=s+a[i][j];
return (s);
}


Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика