С указателями всегда всё непросто, особенно в С++. И особенно, если мы имеем дело с классами/объектами. Допустим, у нас есть такой класс:
class TCoord
{
public:
int X = 0;
int Y = 0;
};
А в программе мы захотели сделать что-то типа этого:
TCoord Coord; //Объект Coord
TCoord* PCoord = &Coord; //Указатель на Coord
*PCoord.X = 5; //!!! Это не компилируется
Здесь мы пытаемся записать число 5 в свойство Х через указатель PCoord. Но у нас это не получится - компилятор выдаст ошибку. Хотя всё это прекрасно работает с обычными переменными (пример см. здесь). Но почему с объектом это не прокатывает?
А всё дело в том, что оператор . выполняется раньше, чем оператор *, поскольку имеет более высокий приоритет. То есть мы пытаемся записать значение в свойство объекта раньше, чем разыменовываем указатель. Это и приводит к ошибке.
И хотя сообщение об ошибке в этом случае довольно внятное:
[Error] request for member 'X' in 'PCoord', which is of pointer type 'TCoord*' (maybe you meant to use '->' ?)
не каждый новичок додумается, что с этим делать. В сообщении нам советуют использовать ->, и это правильное решение. Но если вам очень хочется оставить * для разыменования указателя, то и это возможно. Только придётся использовать скобки для повышения приоритета оператора, как это делается во всех остальных случаях:
(*PCoord).X = 5;
и вот это уже будет работать.
Ну и для лучшего понимания рисунок с исходным кодом:
На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.