Assume p is a pointer to a struct: e.g. struct point *p;
Highest precedence ->. The -> operator first dereferences p and returns the value of the member: so p->x ==(*p).x
Next precedence is * which dereferences the first element of str which is a char array. So if str is a char array pointing to {'h', 'e','l','l','o}, what we get back with * is the character 'h'.
In essence, yes. The char type is really just a single-byte integer that holds the ASCII code of a character. 'h' is just a way to refer to 104, the ASCII code for the character 'h'. Incrementing it yields 105, which happens to be the ASCII code for the character 'i'.