Кент Рейсдорф. 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 по-прежнему передается по значению, поэтому код функции не требует изменения.