# 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 - одноименный шикарный сайт (форум), вопросов и ответов на темы программирования.