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

Презентация:



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

МАССИВЫ 4 Определение 4 Описание 4 Обращение к элементам массива 4 Связь массивов с указателями 4 Примеры программ.
УКАЗАТЕЛИ. Переменная - это именованная область памяти с заданным типом. [=значение]; int a; //Переменная типа integer с именем a int b=2;// Переменная.
Лекция 3. Одномерные массивы, указатели и ссылки Красс Александр СПбГУ ИТМО, 2008.
Разработчики: Деникин А.В., Деникина Н.В.1 МАССИВЫ В C#. Содержание Принципы работы с массивами Типовые алгоритмы обработки массивов Сортировка массивов.
Массивы и строки Лекция 5. Одномерные массивы. Объявление. Общая форма объявления: тип имя_переменной[размер]; Пример: double balance[100]; balance[3]
Основы информатики Массивы. Указатели. Заикин Олег Сергеевич
Переменная - это величина, которая имеет имя, тип и значение. Значение переменной может меняться во время выполнения программы. В компьютерах каждая переменная.
Основы информатики Лекция. Массивы. Указатели. Заикин Олег Сергеевич
Лекция 14 Динамические данные. Виды памяти Существует три вида памяти: статическая, стековая и динамическая. Статическая память выделяется еще до начала.
Массивы данных Подготовила: Камышная И.Н.. Массивы данных Массив – это упорядоченная по возрастанию индексов (номеров) совокупность данных одного типа,
Информационные технологии Классы памяти auto static extern register Автоматические переменные создаются при входе в функцию и уничтожаются при.
Массивы Вариант 1 Program upr1; Var s,a:real; I: integer; Begin S:=0; For I:=1 to 10 do Begin Writeln (введите очередное число'); Readln(a); S: =s+a; End;
Сложные структуры данных Связные списки. Структуры, ссылающиеся на себя struct node { int x; struct node *next; };
Элементы ЯПВУ. УКАЗАТЕЛИ. C / С++ Pascal Вся динамическая память в Pascal это сплошной массив байтов (куча). Адрес начала кучи храниться в переменной HeapOrg,
Распределение памяти. Динамическое выделение памяти.
Программирование на языке Си Часть II Тема 1. Массивы Учитель информатики: Корогод В.А.
Введение в C++ Урок 1-2.
Лекция 3 по дисциплине «Программные средства математических расчетов» тема: «Операторы циклов и работа с массивами в С++» гр. 8Е31 Мамонова Татьяна Егоровна.
Урок 8. Понятие массива. Массивы, определение и описание линейного массива. Пример использования. Формирование и обработка одномерных массивов. Поиск в.
Транксрипт:

Под объявлением одномерного динамического массива понимают объявление указателя на переменную заданного типа для того, чтобы данную переменную можно было использовать как динамический массив. Синтаксис: Тип * Имя_Массива; Имя_Массива – идентификатор массива, то есть имя указателя для выделяемого блока памяти. Тип – тип элементов объявляемого динамического массива. Элементами динамического массива не могут быть функции и элементы типа void. Например: /*указатели на начало выделяемого участка памяти, принимающие значения адреса выделяемой области памяти для значений типа int и типа double*/ int *a; double *d;

Существует 2 способа: 1. При помощи операции new 2. При помощи библиотечной функции malloc (calloc)

/*выделение динамической памяти размером 100*sizeof(int) байтов*/ int *mas; mas = new int [100]; /*выделение динамической памяти размером n*sizeof(double) байтов*/ double *m = new double [n]; /*выделение динамической памяти размером 2*4*sizeof(long) байтов. При выделении динамической памяти размеры массива должны быть полностью определены*/ long (*lm)[4]; lm = new long [2] [4];

Синтаксис: Имя_Массива = (Тип *) malloc(N*sizeof(Тип)); или Имя_Массива = (Тип *) calloc(N, sizeof(Тип)); Имя_Массива – идентификатор массива, то есть имя указателя для выделяемого блока памяти. Тип – тип указателя на массив. N – количество элементов массива.

/*выделение динамической памяти размером 10*sizeof(float) байтов*/ float *a; a=(float *)malloc(10*sizeof(float)); // или float *a; a=(float *)calloc(10,sizeof(float)); Так как функция malloc (calloc) возвращает нетипизированный указатель void *, то необходимо выполнять преобразование полученного нетипизированного указателя в указатель объявленного типа.

Освобождение памяти, выделенной под одномерный динамический массив, также осуществляется 2 способами. 1. При помощи операции delete, которая освобождает участок памяти ранее выделенной операцией new. Синтаксис: delete [] Имя_Массива; Имя_Массива – идентификатор массива, то есть имя указателя для выделяемого блока памяти. Например: delete [] mas; /*освобождает память, выделенную под массив, если mas адресует его начало*/ delete [] m; delete [] lm; Квадратные скобки [] сообщают оператору, что требуется освободить память, занятую всеми элементами, а не только первым. 2. При помощи библиотечной функции free, которая служит для освобождения динамической памяти. Синтаксис: free (ИмяМассива); Имя_Массива – идентификатор массива, то есть имя указателя для выделяемого блока памяти. Например: free (a); //освобождение динамической памяти

Адресация элементов динамического массива осуществляется аналогично адресация элементов статического массива, то есть с помощью индексированного имени. Синтаксис: Имя_Массива[Размерность]; или Имя_Массива[ЗначениеИндекса]; Например: mas[5] – индекс задается как константа, sl[i] – индекс задается как переменная, array[4*p] – индекс задается как выражение.

Пример 1. Сформировать динамический одномерный массив, заполнить его случайными числами. Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в чётных позициях, а во второй половине – элементы, стоявшие в нечётных позициях. #include "stdafx.h" #include using namespace std; Int main(){ int *a, n, i; //количество элементов cout > n; cout

Указатель на массив не обязательно должен показывать на начальный элемент некоторого массива. Он может быть сдвинут так, что начальный элемент будет иметь индекс, отличный от нуля, причем он может быть как положительным, так и отрицательным. int main() { float *mas; int m; scanf("%d",&m); mas=(float *)calloc(m,sizeof(float)); //сейчас указатель q показывает на начало массива mas[0]=22.3; mas-=5; /*теперь начальный элемент массива имеет индекс 5, а конечный элемент индекс n-5*/ mas[5]=1.5; /*сдвиг индекса не приводит к перераспределению массива в памяти и изменится начальный элемент*/ mas[6]=2.5; // это второй элемент mas[7]=3.5; // это третий элемент mas+=5; /*теперь начальный элемент вновь имеет индекс 0, а значения элементов q[0], q[1], q[2] равны соответственно 1.5, 2.5, 3.5*/ mas+=2;

/*теперь начальный элемент имеет индекс -2, следующий -1, затем 0 и т.д. по порядку*/ mas[-2]=8.2; mas[-1]=4.5; mas-=2; /*возвращаем начальную индексацию, три первых элемента массива q[0],q[1],q[2], имеют значения 8.2, 4.5, 3.5*/ mas--; /*вновь изменим индексацию. Для освобождения области памяти, в которой размещен массив q используется функция free(q), но поскольку значение указателя q смещено, то выполнение функции free(q) приведет к непредсказуемым последствиям. Для правильного выполнения этой функции указатель q должен быть возвращен в первоначальное положение */ free(++mas); system("pause"); return 0; }

Пример 3. Задача Иосифа Флавия или считалка Джозефуса. Задача в своей основе имеет легенду. Отряд из 41-го сикария, защищавший галилейскую крепость Массада, не пожелал сдаваться в плен блокировавшим его превосходящим силам римлян. Сикарии стали в круг и договорились, что каждые два воина будут убивать третьего, пока не погибнут все. Самоубийство – тяжкий грех, но тот, кто в конце концов останется последним, должен будет его совершить. Иосиф Флавий, командовавший этим отрядом, якобы быстро рассчитал, где нужно стать ему и его другу, чтобы остаться последними. Но не для того, чтобы убить друг друга, а чтобы сдать крепость римлянам. В современной формулировке задачи участвует n воинов и убивают каждого k-го. Требуется определить номера m и t начальных позиций двоих воинов, которые должны будут остаться последними. void kill(int *mass,int n,int i); void krug(int *mass,int n,int k, int i=0); int main() { int n,k,*mass,i; FILE *f; f=fopen("input.txt","r"); fscanf(f,"%d %d",&n,&k); fclose(f);

mass=(int *)malloc(n*sizeof(int)); for (i=0;i

задания 1.Задан массив. Определить сколько раз меняется знак в данной последовательности чисел, запомнить номера позиций, в которых меняется знак. 2.Задана последовательность из N вещественных чисел. Вычислить сумму чисел, порядковые номера которых являются числами Фибоначчи. 3.Задана последовательность из N вещественных чисел. Найти частное средних арифметических значений элементов с нечетными и четными индексами. 4.Напишите программу, оформив её в виде функций генерации, вывода и обработки массивов. Сформируйте динамический одномерный массив, заполните его случайными числами и выведите на печать. Добавьте после каждого отрицательного элемента его модуль и выведите массив на печать. Реализуйте данную программу двумя способами: a) с помощью операций new и delete; b) с помощью библиотечных функций malloc (calloc) и free.

Контрольные вопросы 1.В каких ситуациях в программировании целесообразно использовать динамические массивы? 2.Что будет возвращено при попытке объявить динамический массив недопустимо большого размера? 3.Как размещаются в памяти элементы одномерного динамического массива? 4.С какой целью используется первая пара скобок при объявлении (Тип*) malloc(N* sizeof(Тип))? 5.С какой целью выполняется явное преобразование типов значений функций malloc (сalloc) при объявлении массивов? 6.Почему указатель на одномерный динамический массив не всегда показывает на его начальный элемент? 7.Какими способами можно обратиться к элементам одномерного динамического массива? 8.С какой целью используются квадратные скобки в операции освобождения динамической памяти, выделенной под массив: delete [] mass;?