- •Структуры и алгоритмы обработки данных Введение
- •1. Структуры данных
- •1.1 Уровни структур данных
- •1.2 Классификация структур данных
- •1.3. Информация и ее представление в памяти эвм
- •2. Простые структуры данных
- •2.1. Понятие о типах данных
- •2.2. Перечисляемый тип данных
- •2.3. Стандартные типы данных
- •2.3.1. Целочисленные типы
- •2.3.2. Вещественные числа
- •2.3.3. Представление и структуры хранения логической информации
- •2.4. Указатели
- •2.4.1. Назначение и смысл указателей
- •2.4.2 Операции с адресами
- •2.4.3 Указатели на указатели
- •2.5. Алгоритмы обработки простых структур данных
- •3. Линейные статические структуры данных
- •3.1 Массивы
- •3.2. Динамические массивы
- •3.3. Многомерные массивы
- •3.4. Связь массивов с указателями
- •3.5. Строки
- •3.6. Массивы указателей
- •3.7. Интерпретация составных описателей
- •3.8 Алгоритмы обработки статических линейных струткур
- •4. Ссылки
- •5. Интегральные типы данных (структуры, битовые поля, объединения)
- •5.1. Структуры
- •5.2. Битовые поля
- •5.3. Объединения
- •6. Файлы
2.4.3 Указатели на указатели
Поскольку указатель – это объект в памяти, то можно определить указатель на указатель, указатель на указатель на указатель, и так сколько нужно раз.
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))
2.5. Алгоритмы обработки простых структур данных
Уровень сложности простых структур данных таков, что понятие «алгоритм обработки» к ним мало применимо. Лучше использовать термин «операция». Из основных алгоритмов обработки, перечисленных во введении, к простым структурам применимы операции просмотра и модификации в разных вариантах, например на языке Си++:
#include <iostream.h> // #include – аналог директивы uses в Паскале
int main() // Точка входа в программу (начало программы)
{
int a; // Создание (определение) локальной переменной без инициализации
cin >> a; // Ввод с клавиатуры (из внешнего потока ввода)
a++; // Модификация (инкремент)
a--; // Декремент
if(a = = 0) // Сравнение
a = 1; // Модификация (присваивание значения)
cout << a; // Считывание – вывод на дисплей (во внешний поток вывода)
return 0; // Завершение программы
}
3. Линейные статические структуры данных
3.1 Массивы
Как было отмечено выше, арифметические операции, выполняемые над указателем и целым значением, имеют осмысленный результат, если указатель адресует непрерывный блок памяти, хранящий множество элементов одного типа. Именно этот блок и называется массивом. Одномерные массивы часто называются векторами.
Массив объявляется указанием числа элементов массива, которое должно быть положительным целым константным выражением, заключённым в квадратные скобки [ ].
float echo[10];
Индексация элементов массива в языке C++ начинается с нуля.
Массивы в принципе являются статическими структурами данных, т.е. не могут изменять изначально заданный размер. В то же время в языках Си/Си++ могут существовать переменные любых типов и массивы, отдельно специфицированные как статические (т.е. имеющие статический класс памяти).
static int mas1[20];
Это означает, во-первых, что такие переменные и массивы существуют в программе от точки создания до конца работы программы и, во-вторых, гарантируется, что такие переменные и массивы инициализируются нулями или эквивалентными значениями.
В разных языках программирования информация о размере массива может храниться в самом массиве (дескрипторный способ в языке Паскаль), либо размещаться в системных переменных и быть недостпной для программиста (обычные массивы с Си/Си++). В последнем случае при работе с массивом требуется явно указывать его размер.
Массивы могут быть инициализированы набором значений, заключённых в фигурные скобки. Если при инициализации число значений меньше заданного числа элементов, то оставшиеся элементы инициализируются нулями или эквивалентными значениями.
int a[5] = {7, 6, 9}; // a[3]=a[4]=0
Если указаны все инициализирующие значения, то размер одномерного массива (или число элементов по первой размерности для многомерного массива) может отсутствовать. Для одномерного массива оно равно числу инициализирующих значений.
int a[] = {7, 6, 9, 3, 4};