Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DSD_Spiskovye_struktury_dannykh_na_baze_massivo...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

1.1.2Статические массивы указателей

В статических массивах указателей резервируется место для максимального количества указателей на элементы списка SizeArrH+1, а место для элементов списка выделять или освобождать в динамической памяти по мере необходимости.

Количество элементов списка определяется переменной Count. Первоначально Count равно 0. После добавления очередного элемента Count увеличивается на 1. Для дальнейшего изложения используем следующие типы данных и переменные:

const int SizeArrH = 20; /*верхняя граница массива указателей*/

typedef struct ElmList

{

char Name[30];

int Age;

char Address[30];

} TElmList; /*тип для элемента списка */

TElmLis* Ar [SizeArrH]; /*Объявление массива указателей на

элементы списка*/

Массив указателей размещается в статической памяти. Здесь SizeArrH задает верхнюю границу массива, а Count - реальное количество элементов в массиве или, что тоже, количество элементов в списке. Причем Count всегда меньше или равно SizeArrH+1. Таким образом, максимальное количество элементов в списке равно SizeArrH+1. Переменная J соответствует индексу текущего элемента массива или, что тоже, соответствующему элементу списка, причем J всегда меньше или равно Count.

Обращение к элементу массива указателей на элементы списка. Пусть, например, необходимо получить доступ к элементу массива с индексом 5. Это выглядит следующим образом:

Arr [5]

Здесь сначала с помощью имени Arr выполняется доступ к первому элементу массива указателей на элементы списка. Затем выполняется доступ к элементу массива указателей с индексом 5.

Обращение к элементу списка. Пусть, например, необходимо получить доступ к элементу списка с индексом 5. Это выглядит следующим образом:

Примечание: Оператор [ ] имеют больший приоритет, чем оператор разыменования указателя *, поэтому, сначала будет взят элемент массива с индексом 5, а затем к нему будет применяться оператор разыменования указателя.

* Arr [5]

Здесь сначала с помощью имени Arr выполняется доступ к первому элементу массива указателей на элементы списка. Затем выполняется доступ к элементу массива указателей с индексом 5, после чего выполняется доступ к первому байту элемента списка с индексом 5.

Обращение к конкретному полю элемента списка. Для того, чтобы обратиться к полю (элементу) структуры через указатель, используется оператор ссылки на поле структуры->. Обращение к полю Name пятого элемента списка будет иметь вид:

Arr [5] -> Name

Это значение эквивалентно значению выражения :

(* Arr [5] ) . Name

Общий вид обращения к полю структуры можно записать так:

Структура . поле (1)

Указатель на структуру -> поле (2)

или так

(*указатель на структуру) . поле (3)

Поскольку в данном курсовом проекте используются указатели на структуры, то чаще всего будет использоваться обращение к полю вида (2).

Для работы с указателями используется ряд операторов таблицы 1.1:

Таблица 1.1- Операторы С++ для работы с указателями

*указатель

Оператор разыменования указателя. Возвращает значение, хранящееся по указанному адресу

&операнд

Оператор получения адреса. Возвращает адрес своего операнда

указатель->поле структуры

Оператор ссылки на поле структуры. Позволяет получить доступ к полю структуры, адрес которой содержит указатель.

(тип) выражение

Приведение типов. Значение выражения преобразуется в значение типа тип.

sizeof(тип или переменная)

Вычисляет длину операнда в байтах.

[ ]

Индексация массива

( )

Повышение приоритета операций, заключенных внутри скобок

Примечание. Во избежание множества ошибок при работе с данными в динамической памяти очень важно знать приоритеты этих операторов – см. Таблица 1.2.

Таблица 1.2 – Приоритеты операторов в С++:

Высший

( ) [ ] ->

Низший

(тип) & sizeof *

Пусть полю Name элемента списка с индексом 5 необходимо присвоить некоторое значение. Это выполняется следующим образом:

strcpy( Arr [5] -> Name, "Иванов" );

и, наоборот,

char x[30]="";

strcpy( x , Arr [5] -> Name);

Здесь сначала с помощью имени Arr выполняется доступ к первому элементу массива указателей на элементы списка. Затем выполняется доступ к элементу массива указателей с индексом 5, после чего выполняется доступ к первому полю элемента списка с индексом 5.

На много проще эта оперция выполняется с числовыми полями. Для того, чтобы в поле Age элемента списка с индексом 5 занести значение 18 необходимо сделать следующее:

Arr [5] -> Age = 18

и, наоборот,

int n = Arr [5] -> Age;