int i = 0; // integer type
If I want to point to i I need a pointer to integer type:
int* ip; // pointer to integer type
If I want to point to ip I need a pointer to (pointer to integer) type:
int** ipp; // pointer to (pointer to integer) type
That's needed because ip is type int*. So a pointer to that is int**.
Whenever you need a pointer to a given type, you use a * in the declaration. Even if that type is already a pointer type.
So to point to a value, you need int*.
So to point to a pointer to a value, you need int**.
So to point to a pointer to a pointer to a value, you need int***.
So to point to a pointer to a pointer to a pointer to a value, you need int****.
etc...