Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 3.2 (ч.1). Команды и данные. Абстракция да...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
624 Кб
Скачать
☆

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, тип данного, размерность,

[ «(», инициализатор, «)» ], «;»;

Примеры:

  1. // динамическое выделение 400 байтов памяти под одномерный массив X

float *X = new float [100];

  1. // динамическое выделение 200 байтов памяти под двухмерный массив Y

int (*Y)[10] = new int[10][10];