Поскольку указатель – это объект в памяти, то можно определить указатель на указатель, указатель на указатель на указатель, и так сколько нужно раз.
int i = 88;
int *pi = &i;
int **ppi = π
int ***pppi = &ppi;
***pppi ~ 88
Порядок выполнения операции * – справа налево, поэтому обеспечивается последовательный доступ к участку памяти с адресом pppi, затем – с адресом (*pppi) ~ ppi, затем – с адресом (*ppi) ~ pi, затем с адресом (*pi) ~ i.
pppi –> (*pppi) ~ ppi –> (*ppi) ~ pi –> (*pi) ~ i
***pppi ~ *(*(*pppi))
Уровень сложности простых структур данных таков, что понятие «алгоритм обработки» к ним мало применимо. Лучше использовать термин «операция». Из основных алгоритмов обработки, перечисленных во введении, к простым структурам применимы операции просмотра и модификации в разных вариантах, например на языке Си++:
#include <iostream.h> // #include – аналог директивы uses в Паскале
int main() // Точка входа в программу (начало программы)
{
int a; // Создание (определение) локальной переменной без инициализации
cin >> a; // Ввод с клавиатуры (из внешнего потока ввода)
a++; // Модификация (инкремент)
a--; // Декремент
if(a = = 0) // Сравнение
a = 1; // Модификация (присваивание значения)
cout << a; // Считывание – вывод на дисплей (во внешний поток вывода)
return 0; // Завершение программы
}
Как было отмечено выше, арифметические операции, выполняемые над указателем и целым значением, имеют осмысленный результат, если указатель адресует непрерывный блок памяти, хранящий множество элементов одного типа. Именно этот блок и называется массивом. Одномерные массивы часто называются векторами.
Массив объявляется указанием числа элементов массива, которое должно быть положительным целым константным выражением, заключённым в квадратные скобки [ ].
float echo[10];
Индексация элементов массива в языке C++ начинается с нуля.
Массивы в принципе являются статическими структурами данных, т.е. не могут изменять изначально заданный размер. В то же время в языках Си/Си++ могут существовать переменные любых типов и массивы, отдельно специфицированные как статические (т.е. имеющие статический класс памяти).
static int mas1[20];
Это означает, во-первых, что такие переменные и массивы существуют в программе от точки создания до конца работы программы и, во-вторых, гарантируется, что такие переменные и массивы инициализируются нулями или эквивалентными значениями.
В разных языках программирования информация о размере массива может храниться в самом массиве (дескрипторный способ в языке Паскаль), либо размещаться в системных переменных и быть недостпной для программиста (обычные массивы с Си/Си++). В последнем случае при работе с массивом требуется явно указывать его размер.
Массивы могут быть инициализированы набором значений, заключённых в фигурные скобки. Если при инициализации число значений меньше заданного числа элементов, то оставшиеся элементы инициализируются нулями или эквивалентными значениями.
int a[5] = {7, 6, 9}; // a[3]=a[4]=0
Если указаны все инициализирующие значения, то размер одномерного массива (или число элементов по первой размерности для многомерного массива) может отсутствовать. Для одномерного массива оно равно числу инициализирующих значений.