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

1.1.12Замечания по оператору &

Оператор & языка C++ позволяет получить месторасположение в памяти программы любой переменной.

Следует подчеркнуть, что оператор & позволяет получить адрес любой правильно квалифицированной переменной - скалярной, структуры или поля структуры, массива или элемента массива и т.д. Этот адрес указывает на 1-ый байт области памяти, отведенной под переменную конкретного типа.

Следует также подчеркнуть, что полученный таким образом адрес является бестиповым указателем и его можно использовать в качестве значения переменной типа void* - нетипизированный указатель. Следовательно, для правильной работы с переменной требуемого типа, указатель на которую получен, необходимо выполнить приведение нетипизированного указателя к конкретному типу.

Пусть имеются следующие объявления:

void* Ptr;

TElemList ElmLst;

TElemList * PtrList; /*типизированный указатель на элемент списка*/

TElemList ArrElmLst[10];

void* NPtrAr; /*нетипизированный указатель для работы с элемен

том записи или массива*/

int J;

int P;

char * S;

Тогда можно выполнить следующие действия:

Ptr = &ElmLst.Age; /*взятие адреса поля Age записи ElmLst*/

*((int*)Ptr) = 54; /*заполнение поля записи - аналог ElmLst.Age=54 */

J= *((int*)Ptr); /*чтение поля записи*/

textBox1->Text = (*((int*)Ptr)).ToString(); /*вывод поля Age записи - аналог

textBox1->Text=J.ToString();*/

Ptr = &ElmLst.Name; /*взятие адреса поля Name записи ElmLst*/

S = (char*)Ptr; /*S указывает на строку в поле Name записи*/

textBox1->Text = __gc new String(S); /*перевод С-строки в строку System::

String и вывод поля Name записи*/

P = (int)Ptr; /*Значение Ptr преобразовываем в значение типа int*/

/* Вывод значения Ptr на экран*/

textBox1->Text = System::String::Concat(S"Значение указателя = ", Convert::

ToString(P));

Ptr = &ArrElmLst[2]; /*взятие адреса элемента массива*/

/*заполнение поля записи эле-мента массива - аналог (ArrElmLst[2].Age=) */

((TElmList*)Ptr)->Age = Convert::ToInt32(textBox1->Text);

J = ((TElmList*)Ptr)->Age; /*чтение поля записи элемента массива*/

/*вывод поля записи элемента массива - аналог textBox2->Text = Convert:: ToString(J)*/

textBox2->Text=Convert::ToString(((TElmList*)Ptr)->Age);

Ptr = &ArrElmLst[2].Age; /*взятие адреса поля записи элемента массива*/

J = *((int*)Ptr); /*чтение поля записи элемента массива*/

/*вывод поля записи элемента массива - аналог textBox2->Text = Convert::ToString(J)*/

textBox2->Text=Convert::ToString(*((int*)Ptr));

Аналогичные действия можно проделать и с динамическими переменными, память для которых выделяется с помощью операторов new и delete.

Пусть оператором new память выделяется для записи.

PtrList = new TElmList;

Тогда возможно:

Ptr = &PtrList->Age;

*((int*)Ptr)= Convert::ToInt32(textBox1->Text); /*ввод поля Age записи – аналог PtrList->Age = Convert::ToInt32(textBox1->Text);*/

Пусть теперь оператором new память выделяется для массива

void* NPtrAr = new TElmList [20];

Тогда получить адрес поля Age второго элемента массива можно так:

Ptr = &((((TElmList*)NPtrAr)[2]).Age);

Ввод значения в поле Age второго элемента массива:

*((int*)Ptr) = Convert::ToInt32(textBox1->Text);

/* аналог ((((TElmList*)NPtrAr)[2]).Age) = Convert::ToInt32(textBox1->Text); */

Рассмотренные возможности могут быть использованы для повышения гибкости процедур обработки данных, в частности, функций сравнения однотипных полей разнотипных данных.