Short version: Yep.

Longer version: I hope you understand the * operator. Now, we have a pointer, p.
*p returns the value which p points to (p holds the memory address of that value.). p+1 is the next element from that address, and so forth. So, *(p+1) is the value of the next element from p. Shorthand form of it is p[1]. So, sprites[0] is pretty unnecessary, since it converts to *(sprites+0). As you can see now, (*sprites).x is the same as sprites->x. ( a->n converts to (*a).b)
The reason you can't use simply the . operator is because C passes copies of a variable into a function, most likely. That would mean that modifying it wouldn't do you any good, since it's just a copy, that gets discarded when you exit the function. However, if that variable is a memory address (pointer) you can just as well point to the same area with a copy, therefore allowing you to manipulate the data stored at that address with ease.

If the above didn't make much sense, don't worry, I suck at explaining stuff. Also, probably the only thing that you'll be able to screw up, no matter how experienced you are, are pointers.