1. Introduction
We know that pointers are the special variables which can hold the address of the other normal variables. Pointers too have the memory allocated. Number of bytes allocated for the pointer variables depends on the size of the address bus.
Say, e.g: On a 32-bit address bus, the size of the pointer will be 4 bytes long, meaning 4 bytes of memory will be allocated to store the address of the other normal variables. Similarly, in 64 bit address bus, the size of the pointer will be 8 bytes long.
The address of the pointer variables can be stored in the other pointer variables called as Pointer to Pointer. Let us understand this concept in detail with various examples.
2. Consider the below table,

Table-1:
3. Example-1
Consider the code shown in code-1,
#include <stdio.h>
int main()
{
/* Define the variable 'a' of int type */
int a = 10;
/* Define the single level pointer */
int *p1 = &a;
/* Define the second level pointer */
int **p2 = &p1;
/* Define the third level pointer */
int ***p3 = &p2;
/* Printing the value and address */
printf("Value @ address %p: %d\n", &a, a);
printf("Value @ address %p: %p\n", &p1, p1);
printf("Value @ address %p: %p\n", &p2, p2);
printf("Value @ address %p: %p\n", &p3, p3);
return 0;
}
Code-1:
In the above code-1, printing the value and address of each variable gives the output as shown in the picture below,

Picture-1: Output of the code-1
The details of the output is shown in the below table-2,

Table-2
Note-1: In the above table-2, In general the address of one variable becomes the value for the another variable.
e.g: The address of variable ‘a’ becomes the value for the pointer variable ‘p1’, likewise the address of pointer variable ‘p1’ becomes the value for the pointer to pointer variable ‘p2’ and so on.