Оцените презентацию от 1 до 5 баллов!
Тип файла:
ppt / pptx (powerpoint)
Всего слайдов:
18 слайдов
Для класса:
1,2,3,4,5,6,7,8,9,10,11
Размер файла:
103.00 kB
Просмотров:
68
Скачиваний:
0
Автор:
неизвестен
Слайды и текст к этой презентации:
№1 слайд
Содержание слайда: Понятие о динамических данных. Работа с динамическими массивами.
Лекция №4
№2 слайд
Содержание слайда: Данные (классификация по времени жизни)
№3 слайд
Содержание слайда: Динамическое распределение памяти используется:
когда статической памяти и стека подпрограмм не хватает для решения задачи;
когда объем требуемой памяти (например, число элементов массива) неизвестен до выполнения программы (вводится или вычисляется);
когда характер задачи требует динамического распределения (данные поступают порциями в процессе выполнения программы, например, в режиме реального времени).
№4 слайд
Содержание слайда: Указатели в Си
№5 слайд
№6 слайд
№7 слайд
№8 слайд
№9 слайд
№10 слайд
Содержание слайда: Связь массивов с указателями в Си
№11 слайд
№12 слайд
№13 слайд
Содержание слайда: Функции Си для распределения и освобождения памяти (<stdlib.h>)
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 <iostream.h>
#include <conio.h>
#include <stdlib.h>
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<n;i=i+1)
cin>>a[i];//*(a+i)
for (i=0;i<n;i=i+1)
a[i]=a[i]*a[i];
cout<<"Squares of elements:\n";
for (i=0;i<n;i=i+1)
cout<<a[i]<<" ";
cout<<endl;
_getch();
free(a);
}
№17 слайд
Содержание слайда: Пример 2. Динамические матрицы
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
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<n;i=i+1)
{
a[i]=(int*)malloc(m*sizeof(int));
for (j=0;j<m;j=j+1)
cin>>a[i][j];//*(*(a+i)+j)
}
for (i=0;i<n;i=i+1)
for (j=0;j<m;j=j+1)
a[i][j]=2*a[i][j];
cout<<"The changed matrix:\n";
for (i=0;i<n;i=i+1)
{for(j=0;j<m;j=j+1)
cout<<a[i][j]<<" ";
cout<<endl;
free (a[i]);
}
_getch();
free(a);
}
№18 слайд
Содержание слайда: Пример 3. Параметры функций типа тип**
#include <iostream.h>
#include <conio.h>
float sum(float **a, int n, int m);
void main()
{ float **a; int n,m, i,j;
cout<<"Input n,m"<<endl;
cin>>n>>m;
a=new float*[n];
for (i=0;i<n;i++)
{ a[i]=new float[m];
for (j=0;j<m;j++)
cin>>a[i][j];
}
cout<<"sum="<<sum(a,n,m)<<endl;
_getch();
for (i=0;i<n;i++)
delete [] a[i];
delete [] a;
}