Инструменты пользователя

Инструменты сайта


massiv

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

massiv [2018/08/02 10:19]
massiv [2020/06/13 13:46] (текущий)
Строка 1: Строка 1:
 +====== Массив ======
 +<note important>Имя массива интерпретируется как адрес первого элемента массива. Адрес первого элемента массива является ссылкой на весь массив. Имя массива можно рассматривать, как указатель-константу.</note>
 +<note important>При передаче массива функции обычно передается и его размер, чтобы функция могла обрабатывать конкретное число элементов массива. В противном случае пришлось бы применять глобальную переменную или прописывать вручную в вызываемой функции.</note>
 +  * **Понятие массива**:
 +  - Массив – это совокупность переменных, которая позволяет хранить несколько однотипных значений.
 +  - Все значения этой совокупности объединены под одним именем.
 +  - При этом каждая переменная в массиве является самостоятельной единицей под названием - элемент.
 +  - Каждый элемент имеет свой порядковый номер - индекс. По индексу можно обращаться к конкретному элементу массива.
 +  - Нумерация элементов в массиве начинается с нуля.
  
 +  * **Расположение массива в памяти.**
 +Массив располагается в памяти последовательно, элемент за элементом. Сначала лежит нулевой, потом первый и т.д. Элементы располагаются по возрастанию адреса: Один элемент массива отстоит от другого на количество байт, равное базовому типу массива. Формула, по которой производится позиционирование по массиву: 
 +<file>
 +базовый адрес + размер базового типа * индекс;
 +</file>
 +Если указывается неправильный адрес производится позиционирование базового адреса на адрес, вычисленный по формулам. При этом программа получает полный доступ к содержимому ячейки памяти, которая ей по сути не пренадлежит. В результате этого может произойти ошибка на этапе выполнения.
 +
 +Каждый элемента массива имеет свою собственную размерность, которая напрямую зависит от типа всего массива. Например, если массив имеет тип данных int - размер каждого элемента в нем - 4 байта. Таким образом, общий размер всего массива вычисляется по формуле: 
 +<file>
 +ОБЩИЙ_РАЗМЕР = РАЗМЕР_ТИПА_ДАННЫХ*КОЛИЧЕСТВО_ЭЛЕМЕНТОВ_В_МАССИВЕ
 +</file>
 +
 +====== Синтаксис объявления массива ======
 +Для начала, нам необходимо научиться создавать массив. А, для этого - во-первых, определить общий синтаксис. Во-вторых, выяснить, каким правилам и ограничениям этот синтаксис подчиняется.
 +<file>
 +тип_данных имя_массива[количество_элементов];
 +</file>
 +
 +  * тип_данных - любой из существующих, известных вам типов данных. Именно этим типом будет обладать каждый элемент массива.
 +  * имя_массива - любое имя, которое подчиняется "правилам имен переменных" (эти правила мы рассматривали с Вами в первом уроке).
 +  * количество_элементов - число элементов в массиве. На данном месте должно находиться - целочисленное константное значение. Таким значением может быть - либо целочисленный литерал, либо константная целочисленная переменная.
 +<note important> Обратите внимания, что количество элементов массива должно быть определенно на этапе создания программы. Другими словами, задать размерность такого массива в зависимости от какого-то условия или по решению пользователя невозможно. Это приведет к ошибке на этапе компиляции.
 +</note>
 +  * **Вариант первый:** Объявлен массив ar, состоящий из 5 элементов, каждый из которых имеет тип данных int.<file>
 +int ar[5];
 +</file>
 +  * **Вариант второй:** Объявлена константа size, значение которой равно 3, а затем, массив br, состоящий из 3 элементов, каждый из которых имеет тип данных double.<file>
 +const int size=3;
 +double br[size];
 +</file>
 +<note important>Мы рекомендуем вам использовать вторую форму записи, так как она является более корректной и удобной.</note>
 +
 +====== Обращение к элементам массива ======
 +  * **Первый способ - через индексы**
 +Рассмотрим, как обратиться к конкретному элементу массива.
 +Запись значения:
 +<file>
 +имя_массива[индекс_элемента]=значение;
 +</file>
 +Получение значения:
 +<file>
 +cout<<имя_массива[индекс_элемента];
 +</file>
 +Здесь, на место индекса_элемента может быть подставлено ЛЮБОЕ целочисленное значение, в том числе выражение, результатом которого является целое число.
 +
 +<file>
 +const int size=5;
 +int ar[size]; // создание массива
 +ar[2]=25; // запись значения 25 в элемент с индексом 2
 +cout<<ar[2]<<"\n"; // вывод на экран значения элемента с индексом 2 - 25
 +</file>
 +<note important>Еще раз напоминаем - нумерация элементов в массиве начинается с нуля!!! Таким образом в массиве из 5 элементов - последний элемент имеет индекс 4. Выходить за пределы массива нельзя, это приведет к ошибке на этапе выполнения.</note>
 +  * **Второй способ - через указатели**. [[pointer#ukazateli_i_massivy|Указатели и массивы]]
 +
 +====== Варианты инициализации массива ======
 +Заполнить массив данными можно двумя способами:
 +
 +  * Первый способ – инициализация при создании.
 +
 +<file>
 +тип_данных имя_массива[количество элементов]={значение1, значение2, значение3, … значение n};
 +
 +const int size=3; 
 +int ar[size]={1,30,2};
 +</file>
 +При такой форме инициализации есть некоторые особенности:
 +  * Все значения списка инициализации имеют такой же тип данных, как и сам массив, поэтому при создании количество элементов можно не указывать. Операционная система сама определит размер массива исходя из числа элементов в списке инициализации.
 +
 +<file>
 +тип_данных имя_массива[]={значение1, значение2, значение3, … значение n};
 +int ar[]={1,30,2}; //В данной строке массив автоматически получит размер 3.
 +</file>
 +
 +  * Если число элементов в списке инициализации меньше чем число элементов массива, то оставшиеся значения автоматически заполняются нулями:
 +
 +<file>
 +int ar[5]={1,2,3};
 + 
 +такая запись эквивалентна записи:
 +
 +int ar[5]={1,2,3,0,0};
 +</file>
 + 
 +  * Если значений в списке инициализации больше чем количество элементов массива, то происходит ошибка на этапе компиляции:
 +
 +<file>
 +int array[2]={1,2,3}; // ошибка на этапе компиляции
 +</file>
 +
 +  * Второй способ - инициализация массива при помощи цикла. В этом случае заполнить массив значениями, можно с помощью пользователя.
 +====== Двумерные массивы (матрицы) ======
 +Одномерный массив - массив данных, где каждое значение обладает только одной характеристикой - порядковым номером (индексом). Именно по этому индексу мы и обращаемся к конкретному элементу. 
 +
 +Сегодня мы поговорим о многомерных массивах, т. е. о массивах, где каждый элемент описывается несколькими характеристиками.
 +
 +  * **Объявление и расположение в памяти.**
 +Двумерный массив представляет собой совокупность строк и столбцов, на пересечении которых находится конкретное значение. Объявить двумерный массив несложно, необходимо указать количество строк и столбцов. При этом, здесь действуют все теже правила, что и при объявлении одномерного массива. Т. е. нельзя в качестве количества строк и столбцов указывать неконстантные и нецелочисленные значения. 
 +
 +<file>
 +Общий синтаксис:
 +
 + тип_данных имя_массива [число_строк][число_столбцов];
 +
 +Пример:
 + const int row=3; // строки
 + const int col=4; // столбцы
 + int array[row][col]; // массив размером row на col(3х4)
 +</file>
 +{{:2.jpg|}}
 +
 +<note important>Несмотря на то, что мы представляем массив в виде матрицы, на самом деле - любой двумерный массив располагается в памяти построчно: сначала нулевая строка, затем первая и так далее. Об этом следует помнить, т. к. выход за пределы массива может повлечь за собой некорректную работу программы, при этом не выдав ошибки.
 +</note>
 +{{:3massiv.jpg|}}
 +<note tip> Обращение к конкретному элементу массива производится по номеру строки и номеру столбца, например - mr[2][1] - значение, лежащее на пересечении второй строки и первого столбца.
 +</note>