I thought that in gcc, void * and char * are treated the same way when it comes to pointer arithmetic, i.e. void * "points" to a single byte in memory, so the following code
void *p;
p = malloc(sizeof(void));
printf("%p %p\n",p,p+1);
indeed returns 0x984a008 0x984a009. Similarly, void ** points to a pointer, so an increment by one really means an increment by 4 bytes (on a 32 bit OS), i.e. 
void **p;
p = (void **) malloc(sizeof(void *));
printf("%p %p\n",p,p+1);
returns 0x984a008 0x984a00c. However, the following code confuses me
void **p, *p1;
p = (void **) malloc(sizeof(void *));
p1 = (void **) p;
printf("%p %p\n",p1,p1+1);
Since it returns again 0x984a008 0x984a009. What is going on here? 
Ignoring the possible undefined behaviour of void pointer arithmetic for the moment...
The type of p1 is void *.
You can't change a variable's type by assigning a value of a different type to it. p1 will always stay void *.
Any expression of a different type assigned to it will implicitly be cast to void * (or give an error if it can not).
Thus it's essentially the same as the first example.
EDIT:
As far as I know, casting from one pointer type to another doesn't actually do anything, its main purpose is for type-checking.
A pointer is just a memory address, a number, so essentially the memory looks something like: (post-assignment)
  p1       p2
void *   void** <- these types are fixed and known during compilation
------   ------
|1234|   |1234|         at address 1234 = the 4 bytes from malloc
------   ------
  ^
  |
this value is the only thing that will change by assigning p1 to a different value
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With