It's not dumb. Pointers are a difficult topic in C++, since they are used in several different ways.
Here, "void* p" declares p to be a pointer to an object of any non-const type. And since "void *" is itself a non-const type, p can certainly point to an object of type "void *", such as itself.
And of course, the object to point to should already exist (or, as the Standard says in 8.5/2, the initializer must be an "expression involving literals and previously declared variables and functions"), so
void* p;
p = &p;
as Samwise wrote.
To see what I mean by "non-const", and to see that C++ does make certain checks, despite what some people think, try
const int i = 1;
void * p = &i; // this won't compile
It also won't allow void* to point to a volatile int, come to think of it.