Элементарные типы данных (булевы значения, символы, числа) могут быть соединены в две базовые структуры данных, операции над которыми могут реализованы 1-2 машинными инструкциями.
Свойство|Массивы фиксированного размера| Кортежи (структуры)
--|--|--
| \
Однородные|\
Неоднородные
Типы элементов|Все элементы имеют одинаковый тип|Элементы могут иметь разный тип
Объявление|``int a[10];``|``struct pair {``\
`` char c; int k; } a;``
Доступ к элементам|По номеру (индексу): ``a[i]``| По имени поля: ``a.k``
Адрес элемента|адрес объекта + `i`*размер элемента|адрес объекта+суммарный размер предыдущих элементов
Вычисление адреса элемента|во время выполнения|во время компиляции
Индекс массива, состоящего из `n` элементов, является
целым числом и принимает значения от 0 до `n-1` или от 1 до `n`.
В некоторых языках можно указать явно нижнюю и верхнюю границы изменения индекса.
Комбинируя структуры данных, можно получать более сложные:\
``double b[10][10];`` -- матрица (массив из массивов)\
``struct string { short len; char str[256]; } s;`` -- строка (длина и массив символов)
Из элементарных типов данных можно выделить указатель, который хранит адрес объекта. В C++ различают понятия указатель и ссылка (неизменяемый указатель на существующий объект, при использовании ссылки происходит обращение к объекту). В других языках это различие не существенно, так как, с одной стороны, все переменные являются указателями на объекты (даже для элементарных типов данных), а, с другой стороны, не нужны специальные операции доступа к объекту также как у ссылок в С++. В некоторых компилируемых языках (Java, C#) для ускорения вычислений элементарные типы и некоторые структуры могут быть представлены непосредственным значением без указателя.
В С++ использование указателей и ссылок может приводить к ошибкам.
Вместо них лучше использовать ``optional`` и ``shared_ptr``, а применение обычных указателей
нужно ограничить одной функцией в целях оптимизации вычислений, не передавая и не возвращая их другой функции. Для указателей на внутренние части объекта можно использовать ``unique_ptr``. Для классов с умными указателями нужно определять конструктор копий и операцию присваивания, но автоматически определяемый деструктор будет корректным.
Для ссылок допустимым является только возврат ссылки на статическое значение или объект, переданный по ссылке, или его часть. Компилятор выдает только предупреждение в случае ошибки.