The grammar works exactly the same for pointers and iterators. The operations implied by operators are turned into function calls for objects of class type (such as most iterators).
The issue with your code isn't with operator precedence though, in both of these lines there is no sequencing between the increment operation and the second read of the same variable that is incremented elsewhere in the statement. Because of this, you have undefined behaviour so he might see any behaviour from your program including the results that you are seeing.
*p++ = tolower(*p);
*it++ = tolower(*it);
You need to reformulate this statement in a way in which the sequencing is defined. I'm guessing that you want something like this.
char c = tolower(*p);
*p++ = c;