From the point of view of language design, there's no real reason why the arrow operator needed to exist.
From the point of view of compiler design, since C first appeared in the early 70's my guess would be that the designers noticed that compilation could go faster if they relied on the programmer to use the right operator in the right context, rather than having the compiler figuring out what to do. Remember that C was designed for the PDP-11, a machine with less than 8K of memory.
The old historical reason for -> in C (not C++) is actually pretty fascinating, I saw it documented on SO here: https://stackoverflow.com/a/13366168
(in short, in pre-K&R C, -> did not require a pointer on the left, and you could write things like "100->a = 0;" to write zero at address 100 plus the offset of a (a had to be a struct member, all struct members were globally visible, like enumerators). K&R 1st edition imposed the pointer requirement and made A->B same as (*A).B)