No, it doesn't point to anything.
Again with the deliberately awkward interpretations. A pointer identifies a location in memory. The pointer's type gives the size of each item; the actual number of items (which can be zero) is not recorded anywhere. In the case of a void pointer either there is one item of size zero, or zero items of any size; take your pick. Either way it means "no data at this location". The existence of a pointer doesn't imply that there is anything at that location. Consider:
int *p = &array;
The variable p is a pointer to a location in memory, but it's past the end of the array. The item size is sizeof(int), but the number of items is zero. The code is perfectly legal—you're allowed to have a pointer to the location just past the end of an array—but there is nothing there. There may not even be a virtual memory mapping for that location.
The only difference between p and a void pointer, aside from pointer arithmetic, is that the compiler won't stop you from dereferencing p; you'll just get a runtime error, if you're very, very lucky.
So why not reserve the keyword 'address'. And call it that?
Perhaps because we already have this perfectly usable pointer syntax, which identifies both an address and a type, and rather than make up a completely separate "address" type and special-case everything for no reason we can just use a pointer to the existing "void" type, which already means "no data", because if we don't know the type of the data it might as well not exist as far as the compiler is concerned.
Anyone who really wants an "address" keyword for personal reasons can just write "typedef void *address".