
- •Данных. Составные структуры данных
- •3.2.1 Общие положения
- •3.2.1.1 Алфавит языка
- •3.2.1.2 Формат программы
- •3.2.1.3. Комментарии
- •// Пример однострочного комментария
- •3.2.1.4 Зарезервированные слова
- •3.2.2 Данные
- •3.2.2.1 Идентификаторы данных
- •3.2.2.2 Типы данных
- •3.2.2.3 Постоянные
- •3.2.2.4 Переменные
- •3.2.2.5 Массивы
- •3.2.2.6 Структуры
- •3.2.2.7 Объединения
- •Масив X:
- •Адреса элементу:
- •Масив y:
- •3.2.2.8 Перечисления
- •3.2.2.9 Указатели
- •Int Hour;
- •Int Press;
- •3.2.2.9.1 Динамическое выделения памяти для хранения данных
- •3.2.2.9.2 Динамическое освобождение памяти от хранимых данных
- •3.2.2.9.3 Ссылка
- •3.2.2.10 Множества
- •3.2.3 Выражения
- •3.2.3.1 Арифметические операции
- •Char int float | signed unsigned | short (базовый) long
- •3.2.3.2 Битовые операции
- •3.2.3.2 Логические операции
- •3.2.3.4 Операции отношения
- •3.2.3.5 Операция присваивания
- •3.2.3.6 Специальные операции
- •3.2.3.7 Элементарные функции
- •3.8 Приведение типов данных
- •3.2.3.9 Приоритеты операций
- •3.2.3.10 Адресные выражения
3.2.2.4 Переменные
Переменной называется идентифицированный скалярный фрагмент памяти, который может быть модифицирован во время исполнения программы.
Перед использованием в программе переменная должна быть объявлена согласно правилу:
объявление переменных ::= тип данного, идентификатор, [ = инициализатор ],
{ «,»,идентификатор, [ = инициализатор ]; }, «;»;
Примеры объявлений переменных:
// … целого типа
int i, j, N = 8;
signed X;
unsigned Y;
short Massa;
long Duble = 7L;
signed short L;
unsigned long Mole = 02u;
// … действительного типа:
float X, Y = 2.5F;
long float Fuel = 5.347;
double Y = 1.2E-3;
long double Summa = 2.1L;
// … символьного типа:
char Symbol = 'd', S;
unsigned wchar_t Uchar = L’\004d’;
Переменная инициализируется указанным в объявлении инициализатором на этапе выполнения программы. Неинициализированная переменная содержит «мусор», т.е. данные, не определенные ни по значению, ни по знаку. Во избежание ошибок использования неинициализрованных переменных рекомендуется их инициализировать при объявлении хотя бы нулем, например, float X = 0.0f;
Статические данные инициализируются нулями ещё на этапе компиляции программы.
3.2.2.5 Массивы
Массивом называется идентифицированный вектор однотипных данных (элементов), упорядоченных по возрастанию их индексов (номеров).
При решении на компьютере практических задач приходится иметь дело с наборами данных, представленными в виде строк, таблиц или абстрактных множеств с упорядоченной структурой. Наиболее простой структурой является ограниченный вектор элементов фиксированного типа. Элементы вектора считаются перенумерованными последовательно отрезком ряда натуральных чисел; доступ к каждому из них может осуществляться по его индивидуальному номеру. Простота представления подобных структур данных состоит в том, что они естественным образом отображаются на линейную структуру памяти компьютера. Структурным аналогом вектора в языке С++ является массив.
Массив характеризуется:
типом данных элементов;
размерностью (одномерный вектор, двухмерная таблица и т.п.);
размером или длиной (количеством элементов).
Ограничений на размерность массива язык С++ не накладывает. Длина массива ограничена лишь объемом доступной оперативной памяти. Порядковый номер элемента в массиве определяется значением индекса - данным целого типа, значение которого возрастает с шагом 1 при возрастании адреса элемента, причем минимальный индекс имеет значение 0.
Элементы многомерного массива расположены в памяти построчно, т.е. так, что первым изменяется самый правый индекс, а последним - самый левый (рисунок 3.2.2).
Логическое Физическое представление размещение
Рисунок 3.2.2
Строка символов определяется языком как массив символов с завершающим невидимым символом-терминатором '\0' (см. рисунок 1). Поэтому, под размещаемую в памяти строку необходимо отводить на 1 байт больше количества символов в строке.
Массив должен быть объявлен до его использования в программе в соответствии с правилами:
размер ::= целое;
размерность ::= «[», [ размер ] , «]», { «[», [ размер ], «]» };
инициализаторы ::= «{», инициализатор, { «,» инициализатор }, «}»;
объявление массивов ::= тип данного,
идентификатор, размерность, [ =, { инициализаторы } ],
{ идентификатор, размерность, [ =, { инициализаторы } ] }, «;»;
Элементы массива можно инициализировать во время его объявления. Если размер массива при этом не указан, то он определяется количеством инициализаторов. Для многомерного массива можно не указывать размер только по первому измерению, для остальных измерений размер должен быть указан явно. Неинициализированные элементы массива имеют неопределенные значения.
Примеры объявлений массивов:
float Sigma [ ] = {1.8, -3.2, 4.0, 19}; // массив из четырёх действительных чисел
int Data [5] = {8, -3, 4, 1}; // Data0 = 8, ..., Data3 = 1, Data4 не определено
char Prompt [6] = {'R', 'e', 'p', 'l', 'a', 'y'}; // массив из шести символов
char Prompt [ ] = "Replay"; // массив из шести символов длиной 7 байтов
int X [ ][4] = { {5, 3}, {0, -1} }; // X0,0=5, X0,1=3, X1,0=0, X1,1=-1
char S [2][6] = {"Tom", "Peter"}; // S0,0…3 = "Tom", S1,0...5 = "Peter"
Обратиться к элементу массива можно, указав имя массива и индекс элемента массива, например:
Data [i+1]; // обращение к (i + 1)-му элементу массива Data
S[2][0] // элемент на пересечении строки №2 и столбца №0 массива S
Наиболее серьёзной ошибкой при использовании массивов является выход за пределы массива. Так если объявить массив как int X[10];, а затем обратиться к «его элементу» X[10], то произойдет выход за пределы массива (следует вспомнить, что массив индексируется, начиная с 0, а потому максимальное значение индекса массива X равно 9). Считывание и запись данного в ячейки памяти за пределами массива может привести к непредсказуемым последствиям. К сожалению, исполняющая система не контролирует выход за пределы массива, а контроль за корретностью обращения к элементам массива обязан выполнять программист.
Для динамического (т.е. в процессе выполнения программы) определения количества элементов в массиве можно воспользоваться операцией sizeof и инструкцией typeid, например:
int MyArray[ ] = { 1, 2, 3, 4, 5 };
int Quantity =
sizeof (MyArray) / sizeof (typeid (MyArray).name( )); // Quantity станет равным 5