In C, void appears to be some weird exception, but it is actually a real type.

It just happens to be defined as the one type with a length of zero.

The only thing is, you can't do anything to a variable space with a length of zero-- that would make no sense-- so what you can do with void variables is limited to things you can do without attempting to modify or access or do anything with the zero-length memory space it represents.
Thus, you can have a pointer to a void-type variable, or a function of type void (assuming you don't try to do anything with the value returned by the void) but you can't write or read anything into or from a void variable, nor do anything, such as =, which in any way tries to access the zero-length memory space. You can't even declare a normal void variable-- that would involve allocating a memory space of length zero, which again makes no sense. Again though, void pointers (void *) are very legal, and are used a _lot_ in the struct declarations of abstract data types which know they are going to be holding some kind of data but don't know ahead of time what type the data is going to be. Although note that in order to access the memory pointed to by a void *, you have to typecast it to some other kind of pointer.

Maybe it's best you just didn't think about it.