HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Когда мы говорим про примитивные типы данных, такие как int или double, то, на интуитивном уровне, все довольно понятно. Под каждое значение выделяется некоторое количество памяти в соответствие с типом, в которой и хранится само значение. А как должна выделиться память под хранение массива? И что такое массив в памяти? На уровне хранения понятия "массив" не существует. Массив представляется цельным куском памяти, размер которого вычисляется по формуле "количество элементов" * "количество памяти под каждый элемент". Из этого утверждения есть два интересных вывода:</p>
1 <p>Когда мы говорим про примитивные типы данных, такие как int или double, то, на интуитивном уровне, все довольно понятно. Под каждое значение выделяется некоторое количество памяти в соответствие с типом, в которой и хранится само значение. А как должна выделиться память под хранение массива? И что такое массив в памяти? На уровне хранения понятия "массив" не существует. Массив представляется цельным куском памяти, размер которого вычисляется по формуле "количество элементов" * "количество памяти под каждый элемент". Из этого утверждения есть два интересных вывода:</p>
2 <ul><li>Размер массива - это фиксированная величина. Те динамические массивы, с которыми мы имеем дело, во многих языках реализованы уже внутри языка, а не на уровне железа</li>
2 <ul><li>Размер массива - это фиксированная величина. Те динамические массивы, с которыми мы имеем дело, во многих языках реализованы уже внутри языка, а не на уровне железа</li>
3 <li>Все элементы массива имеют один тип и занимают одно и то же количество памяти. Благодаря этому появляется возможность простым умножением (по формуле, описанной ниже) получить адрес той ячейки, в которой лежит нужный нам элемент. Именно это происходит под капотом, при обращении к элементу массива под определенным индексом</li>
3 <li>Все элементы массива имеют один тип и занимают одно и то же количество памяти. Благодаря этому появляется возможность простым умножением (по формуле, описанной ниже) получить адрес той ячейки, в которой лежит нужный нам элемент. Именно это происходит под капотом, при обращении к элементу массива под определенным индексом</li>
4 </ul><p>Фактически, индекс в массиве - смещение относительно начала куска памяти, содержащего данные массива. Адрес, по которому расположен элемент под конкретным индексом, рассчитывается так: начальный адрес + индекс * количество памяти, занимаемое одним элементом:</p>
4 </ul><p>Фактически, индекс в массиве - смещение относительно начала куска памяти, содержащего данные массива. Адрес, по которому расположен элемент под конкретным индексом, рассчитывается так: начальный адрес + индекс * количество памяти, занимаемое одним элементом:</p>
5 <p>Адрес элемента, соответствующего индексу 3, вычисляется так: начальный адрес + 3 * 4 (размер типа данных int). Начальный адрес - это адрес ячейки памяти, начиная с которой располагается массив. Он формируется во время выделения памяти под массив. Ниже пример расчета адресов памяти под разные элементы массива numbers:</p>
5 <p>Адрес элемента, соответствующего индексу 3, вычисляется так: начальный адрес + 3 * 4 (размер типа данных int). Начальный адрес - это адрес ячейки памяти, начиная с которой располагается массив. Он формируется во время выделения памяти под массив. Ниже пример расчета адресов памяти под разные элементы массива numbers:</p>
6 <p>Рассмотрим еще раз определение массива:</p>
6 <p>Рассмотрим еще раз определение массива:</p>
7 <p>Теперь должно быть понятно, почему индексы в массиве начинаются с нуля. 0 - означает отсутствие смещения.</p>
7 <p>Теперь должно быть понятно, почему индексы в массиве начинаются с нуля. 0 - означает отсутствие смещения.</p>