int a; // a is an int
int* b; // b is a pointer to an int (ie, it could point to 'a')
int** c; // c is a pointer to a pointer to an int (ie, it could point to 'b', but not to 'a')
do I have to create another pointer like: int *q and then make p point to q.
That's one way to do it, yes. But you don't have to, I guess.