"Pointer pointer" and "pointer to the pointer" seem to be one meaning, I want to explain this.
INT A = 3; INT * P = & a; int * pp = & p;
In fact, Int * pp = & P is also given to an initial value, but this initial value is a "pointer address", not the usual "variable address" (so the compiler will have a warning!), But It can still be passed. However, from the viewpoint of use, you know that this PP pointer does not have any use, because the PP refers to the address of the pointer P, which is & p (ie pp = & p); then * pp = & a, ie * PP representation variable A Address (cannot say PP pointing variable a).
In this way, to operate the variable A, you can use * p to operate (such as * p = 8), but it will not be line through the PP, because * PP only indicates the address of the variable A, and cannot operate the content in the address, Add * to represent the content within the operation address, but this is the compiler is not allowed, because when you define, the PP is just a pointer, which can only use the * operator.
This situation looks like it is, it can be seen, but can't touch (cannot operate the variable).
So, as defined above, it is not a pointer. It is not much safe. His only changed is the pointing point of the pointer PP (such as * pp1 = 1000, the address pointing by the pointer PP is 1000), but this change It is dangerous and fatal, and there is no practical use, because the change in PP is easy to change (there is no need to change the pointer to your own pointer).
as follows:
INT A = 3, B; INT * P = & a; int * p1 = & b; p = p1;
Therefore, if the beginning defines a pointer to point to the correct way to pointers, it should be as follows:
INT A = 3; INT * P = & a; int ** PP = & P;
As above, PP is a pointer to a pointer. He can play a role in the program, such as ** PP = 8, then a = 8; equivalent * p = 8;
Welcome everyone's pointer to the mistakes, to strengthen the awareness of a deeper level!