Загрузка данных


1. **Указатель** - переменная, хранящая адрес в памяти. В C# работает только в `unsafe`-контексте: `int* p;`
2. **Адрес переменной:** оператор `&` в `unsafe`-блоке: `int x = 5; int* p = &x;`. Для управляемых объектов нужен `fixed`.
3. **Удаление динамического объекта:** в C++ `delete` вызывает деструктор и освобождает память. В C# `delete` нет: объект убирает сборщик мусора, а неуправляемую память освобождают вручную (`Marshal.FreeHGlobal`, `NativeMemory.Free`, `Dispose`).
4. **Двусвязный список:** узел хранит значение, ссылку `Next` на следующий узел и `Prev` на предыдущий; сам список хранит `Head` и `Tail`. При вставке и удалении нужно обновлять обе связи у соседей.
5. **Проблемы со свободной памятью:**
   - утечки памяти;
   - висячие указатели;
   - двойное освобождение;
   - выход за границы;
   - использование неинициализированной памяти;
   - фрагментация.
6. **Коллизия головы с телом:** пройти по всем сегментам тела, кроме головы, и сравнить координаты: `body.Skip(1).Any(s => s.X == head.X && s.Y == head.Y)`
7. **Неблокирующее чтение клавиатуры в Windows:**
   - `Console.KeyAvailable` + `Console.ReadKey(true)`;
   - `GetAsyncKeyState` из `user32.dll`;
   - `_kbhit()`/`_getch()` в C/C++;
   - отдельный поток для ввода;
   - события `KeyDown` в WinForms/WPF.