Когда использовать указатель на указатель для 2D-массива?

Для нижеприведенной программы, используя один указатель,

#include <stdio.h>

int main()
{
    int b[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int *p = b;
    printf("\nElement - %d", *(p+3));
    printf("\nElement - %d", *(p+4));
}

2D-массив b успешно используется с помощью единственного указателя p.

Я также прошел через этот ответ.

Вопрос:

1)

Не чувствовал необходимости указателя на указатель на b. Предполагается, что p является указателем на указатель при работе с 2Darray b?

2)

Когда мы требуем, чтобы p был указателем на указатель, при работе с b?

3)

Требуется n указатель уровня для n-мерного массива?