C/C++ Массивы
До этого момента мы работали с одиночными переменными, но что делать, если необходимо работать с множеством однотипных переменных?
Для этого используются массивы:
Массив – это непрерывная!!! выделенная область в памяти, занятая несколькими переменными (обычно).
Принцип создания массива:
type NameVar[size]; //неинициализированный массив
или
type NameVar[size]={0x00,0x01….size-1}; //сразу задаем значения
или
type NameVar[size]={0}; //инициализируем массив нулями
также массив можно заполнить в цикле, например
for(int i=0;i< size;++i)
Например создадим массив:
long Arr[4];
На рисунке схематично показано расположение массива в памяти, видно, что выделяется область под массив.
Внутри этой области расположены элементы типа long с индексами от 0 до 3,
можно вспомнить, что long имеет размер 4 байта, их порядок (1,2,3,4 или 4,3,2,1) определяется типом ОС и иногда компилятором, поэтому желательно при прямой работе с памятью это учитывать.
Также можно создавать многомерные массивы:
int Arr2x[5][3]; // пример объявление двумерного массива:
В этом массиве будет 5 строк и 3 столбца
| Столбцы
Строки |
0 | 1 | 2 |
| 0 | Arr2x[0][0] | Arr2x[0][1] | Arr2x[0][2] |
| 1 | Arr2x[1][0] | Arr2x[1][1] | Arr2x[1][2] |
| 2 | Arr2x[2][0] | Arr2x[2][1] | Arr2x[2][2] |
| 3 | Arr2x[3][0] | Arr2x[3][1] | Arr2x[3][2] |
| 4 | Arr2x[4][0] | Arr2x[4][1] | Arr2x[4][2] |
Зачем нужны массивы – так как все данные – это Байты и наборы Байтов, то для сложных типов данных нам
1- нужно объединять (группировать их) в большие по размеру области
2-для более удобной сортировки.
Действительно, т.к. элементы в памяти располагаются последовательно, обращаясь по индексу массива мы можем быстро в цикле перебрать переменные.
Например:
У нас меряется напряжение в сети 220В каждую минуту и записывается в массив, время старта измерения известно.
Предположим что произошел сбой (напряжение пропало) и надо определить время этого сбоя, мы можем в цикле найти и этот сбой и определить время:
Пусть массив измеренных значений выглядит так
int Arr_Voltage[10]{220,230,210,230,150 0,0,220,230,210};
Тогда:
int j=0;
for(int i=0;i<10;++i)
{
if(Arr_Voltage[i]==0)
{
j=i;
break;
}
}
Теперь в переменной j хранится номер отсчета напряжения, когда произошел сбой, прибавив его к времени старта измерений получим время сбоя.
В языках 4.C и C++ есть интересная функция для работы с массивами – sizeof(Arr), она позволяет определить размер массива в Байтах, т.е. если ее применить для массива long Arr[4];
int ArrSize=sizeof(Arr);
То в ArrSize будет значение 16,но если переделать функцию
int ArrSize=sizeof(Arr)/sizeof(Arr[0]);
то мы получим 16/4=4 элемента.
Подобную функцию удобно использовать для массивов, которые могут изменяться, или чтобы не хранить глобальные переменные с размером массива.
