- •Данных. Составные структуры данных
- •3.2.1 Общие положения
- •3.2.1.1 Алфавит языка
- •3.2.1.2 Формат программы
- •3.2.1.3. Комментарии
- •// Пример однострочного комментария
- •3.2.2.2 Типы данных
- •3.2.1.4 Зарезервированные слова
- •3.2.2 Данные
- •3.2.2.1 Идентификаторы данных
- •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 Адресные выражения
Int Hour;
int Min;
int Sec;
};
struct Time Timer; // объявление структуры Timer
struct Time *ptrTimer = &Timer; // объявление указателя ptrTimer на структуру Timer
Тогда обращение к элементу Hour структуры Timer записывается как: (*ptrTimer).Hour или ptrTimerHour10.
Можно объявить указатель на объединение, например, так:
union Key {
Int Press;
char Codes [2];
};
Key Touch; // объявление объединения Touch
Key *ptrTouch =&Touch; // объявление указателя ptrTouch на объединение Touch
Тогда обращение к элементу Press объединения Touch записывается как: (*ptrTouch).Press или ptrTouchPress.
Наиболее серьёзной ошибкой при использовании указателей является манипулирование неинициалиированным указателем. Так объявление указателя int *X; приводит к тому, что указатель X ссылается на неопределенный участок памяти компьютера. В таком случае попытка считывания данного операцией *X приведет к считыванию содержимого неизвестной ячейки памяти. Запись же данного по адресу, на который ссылается этот указатель, может и вовсе привести к непредсказуемым последствиям. Поэтому, при объявлении указателя его нужно инициализировать хотя бы постоянной NULL.
3.2.2.9.1 Динамическое выделения памяти для хранения данных
Указатели можно использовать для доступа к специальной области памяти, обычно называемой «кучей». Для размещения данного в «куче» во время выполнения программы используется специальный механизм динамического выделения памяти11. Данные, размещаемые в «куче», называются динамическими данными.
Идентифицированные данные можно разместить в «куче» инструкцией new следующего вида:
инструкция выделения памяти под переменную ::=
объявление переменной, =, *, new, тип данного, [ «(», инициализатор, «)» ], «;»;
Например:
double X = *new double (1.2);
В этом случае на данное можно ссылаться по его идентификатору.
Однако, чаще на динамические данные бывает удобно ссылаться с помощью указателей. Объявление указателей на скаляры выполняется с помощью инструкции new следующего вида:
инструкция выделения памяти под скаляр ::=
объявление указателя, =, new, тип данного, [ «(», инициализатор, «)», ], «;»;
Инструкция new такого вида захватывает количество sizeof (тип данного) байтов оперативной памяти из «кучи», инициализирует значением инициализатор и возвращает типизированный указатель на первый байт скаляра.
Например:
// выделение 8 байтов памяти под переменную типа double с её инициализацией
// значением 12.34; на выделенную область памяти ссылается указатель DynamicX
double *DynamicX = new double (12.34);
Для указателей на векторы это делается с помощью инструкции new следующего вида:
инструкция выделения памяти под вектор ::=
объявление указателя, =, new, тип данного, размерность,
[ «(», инициализатор, «)» ], «;»;
Примеры:
// динамическое выделение 400 байтов памяти под одномерный массив X
float *X = new float [100];
// динамическое выделение 200 байтов памяти под двухмерный массив Y
int (*Y)[10] = new int[10][10];
