---
# System prepended metadata

title: 08 Лекция Полная версия

---

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