expression can be read as
*x pointed to by x
&x address of x
x.y member y of object x
x->y member y of object pointed to by x
(*x).y member y of object pointed to by x (equivalent to the previous one)
x[0] first object pointed to by x
x[1] second object pointed to by x
x[n] (n+1)th object pointed to by x
random question: what's the point of the having a different operator? is it to show if the structure in question is a pointer? or is there some other reason?
Its partly because it allows for sometimes having both. The -> operator can be overloaded, hence you can get things like std::unique_ptr which can be used like this:
1 2 3 4
struct A { int a };
std::unique_ptr<A> ptr { new A };
ptr->a = 5;
ptr.reset(new A);