It helps
to not think of them as "pointers", but simply as "memory
addresses". It's just semantics, but it can make one more comfortable
with the idea. The fact is, they're extremely useful, and they work
great. :)
Maybe, but is a void* guaranteed any sort of alignment? Otherwise,
one might as well use an explicit type, such as (unsigned char*) if
that's the addressing granularity intended. Very often, on such
calls, the size of the item in chars is specified, so why not use
that type? One can always cast an int* to a char*, for example.