# 08 Лекция Полная версия [TOC] ## Массивы ```c int q[10]; // завести массив длиной 10 элементов и названием q q[0]; // доступ к 1му (0му) элементу массива q ``` Индекс в массиве - любая **целочисленная** переменная (значение) **Индексироваться double и float нельзя!** Синтаксически можно управлять циклом (итерироваться) с помощью переменных с плавающей точкой, но так делать **НЕ надо!** Нпример, потому что число `1/10` непредставимо в двоичной системе, значение всегда будет чуть больше или чуть меньше, но никогда не `1/10`, то есть `1/10 * 10 != 1;`, более того умножить `1/10` и сложить `1/10` с высокой вероятностью тоже окажется не равным, тк в float и double постояноо происходят окугления. И это всё мы не хотим видеть при управление циклом! ```c int q[10]; ``` Означает, что последний адрес в массиве 9! > Чем больше программируешь - тем больше убеждаешься, что индексация с 0 - оочень удобно Когда мы обращаемся по индексам си НЕ проверяет, что мы уместились в диапазон, например ```c int q[10]; q[100]; // не так страшно, когда мы читаем её, получим мусор q[100] = 0; //страшно здесь ``` Потому что мы пишем в рандомную ячейку памяти, она может хранить всё что угодно: другая переменная, служебные переменные, даже кусок кода => здесь может ничего не произойти, а могут дикие спец эффекты (стандарт си не гарантирует ничего в этом случае) Одна из сложностей языка "C" - нужно следить что ты не вышел за границы массива. Сложность в том, что когда мы бажим в [Undefine believer](https://en.wikipedia.org/wiki/Undefined_behavior), нам стандарт ничего не обещает, полный undefine, по этому у нас программа может работать правильно, а у пользователя, у другого программиста или просто на том же компьютере в другое время - отработать неправильно или вообще упасть. ### Многомерные массивы ```c int q[10][3]; // завести двумерный массив длиной 10 на 3 // и названием q q[1][2] // доступ к 2 элементу 1 строки массива q ``` `q[z][y][x]` принято так индексировать многомерные массивы, тк это больше всего похоже на то, как они храняться в памяти ### Про размер Размеры связанны с тем, где мы создаем переменные. Если мы создаем массив как обычную локальную переменную - общее ограничение на размер стека (пара мегабайт для каждой программы). Если мы попытаемся выделить массив больше, либо программа скажет нам stack overflow, либо просто тихо исчезнет, тк чтобы что-то сказать (сделать) программе нужно свободное место на стеке stackoverflow.com - одноименный шикарный сайт (форум), вопросов и ответов на темы программирования.