Q1: Yes, that is a pointer that points to a pointer. This is called "double indirection" (since a pointer offers single indirection -- though nobody ever seems to call it that).
Q2: p is a pointer to an int, and r is a pointer to a pointer to a char.
So (*r + 0x01) is moving the pointer *r up one character address (presumably 1 byte, but this depends upon the platform you are on).
So
p=(int *)(*r+0x01); is casting this pointer into a pointer to an integer and assigning it to p.
Q3: This is a dereference into a structure. In this case x is a pointer to some structure that has an element named "y".
CODE
#include <stdio.h>
struct foobar {
int a;
int b;
};
void funct(struct foobar* ptr) {
ptr->a = 0;
ptr->b = 1;
}
int main() {
struct foobar foo;
funct(&foo);
printf("foo.a = %d, foo.b = %d\n", foo.a, foo.b);
system("pause");
}
basically it means the same as:
(*x).y just easier to type.