Yes on both questions. You seem to get it.
Accessing memory through a pointer is essentially the same as accessing data directly since everything is stored in memory at some address. The difference is that whenever we have a pointer, we need to explicitly specify when we need to reach through the pointer to access the memory. We do that with the dereference operator *.
Whenever we are dereferencing a pointer with "*mypointer", we are accessing the data located at the address that the pointer points to. It's the same thing with "mypointer->something", which is just another way of writing "(*mypointer).something".
In case of OnePastLastEXEFilenameSlash we want to use it to calculate how long the file path is where the executable is stored. You see how this is done in the Win32GetEXEFileName function.
So we have the pointer to EXEFileName (containing the full path including file name), and we have OnePastLastEXEFilenameSlash that points to the last slash in the char array. We can get the length of the directory portion of the path by taking the difference of the two pointers. This is used in the Win32BuildEXEPathFileName function when creating other paths with the same base directory.
I'm not sure if I'm making any sense or if I'm answering your question. You could try reading through
this to see if the pieces fall into place.
The best way to learn is through experimentation, so play around with this stuff and see if it helps. :)