Here p is a integer pointer that can hold the address of int variable, but it also has a memory address - where it is stored.
let
base address of array a = 1002
address of pointer p = 2008
when we write: int *p=a; //p points to the base address of array a
and int **r=&p; //means *r points to the address of p
how *r points to the address of a, it should point to address of p.
#include <stdio.h>
void main()
{
int a[3] = {1, 2, 3};
int *p =a;
int **r = &p;
printf("%p %p", *r, a);
}
rpoint to the address wherepis stored and then print*r, so obviously that isp, which you assigned to beaint [3]decays toint*