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.