Кент Рейсдорф. BORLAND C++BUILDER. Раздел 1

Кент Рейсдорф. BORLAND C++BUILDER. Страница 59

int z = ptrx; // ошибка!

Однако это не сработает, потому что вы пытаетесь присвоить переменной адресное значение. Встретив такую строку, компилятор выдаст сообщение об ошибке Cannot convert int* to int (Невозможно преобразовать int* в int). Переменные z и ptrx имеют различные типы, поэтому необходимо исполь­зовать оператор разыменования:

int z = *ptrx;

Эту операцию можно рассматривать как обратную по отношению к опе­рации взятия адреса. Здесь вам не нужно значение самой переменной ptrx, т.к. оно представляет собой адрес. Вместо этого вам нужно значение объекта, расположенного по данному адресу. Оператор разыменования сообщает ком­пилятору, что нужно взять значение объекта, на который указывает ptrx, а не само значение ptrx.

Разыменование (dereferencing) означает получение содержимого па­мяти, на которое ссылается указатель.

Как видите, оператор разыменования; используется как для объявления указателя (int* х;), так и для взятия значения объекта, на который ссылается указатель (int z = *х;). По контексту можно определить, как должен использоваться оператор в каждом конкретном случае. Вам не нужно беспокоиться о том, что компилятор не поймет ваших намерений.

Синтаксис Си++ допускает различные стили написания программ. Я предпочитаю ставить оператор разыменования сразу за типом данных при объявлении указа­теля и непосредственно перед указателем при взятии значения объекта:

Я считаю, что моя запись более наглядна, но другие могут, вероятно, привести аргументы в пользу своего способа. Выберите один из вариантов, который кажется вам лучше, и придерживайтесь его в дальнейшем.



Листинг 3.1. (продолжение)

Прежде всего, в строке 13 я объявляю массив listArray как массив указателей. Затем я создаю объекты для каждого элемента массива, используя цикл for в строках 17 и 18. После этого я заменяю оператор прямого доступа (.) на оператор косвенного доступа(->). Я должен также разыменовать указатели в строках 57 и 72, т.к. нельзя использовать вместо самого объекта его адрес. Обратите внимание, что функция displayRecord (начинающаяся со строки 82) не изменилась. Структура mailingListRecord по-прежнему передается по значению, поэтому код функции не требует изме­нения.

Web-дизайн (с) 2010 All rights reserved