C++ 공부하다가 의문이 생겨서 질문드립니다.

#include <iostream>
using namespace std;

int main()
{
        int a[2][2][3] = {{{4,5,6},{7,8,9}},{{10,11,12},{13,14,15}}};

        int (*p)[2][3];

        p=a;

        cout<<"배열 a의 시작 번지 표현: a, &a[0], *a, **a n";
        cout<<a<<"        "<<&a[0]<<"        "<<*a<<"        "<<**a<<endl;

        for(int i=0; i<2; i++)
        {        
                for(int j=0; j<2; j++)
                {
                        for(int k=0; k<3; k++)
                        {
                                cout<<a[j][k]<<"        ";
                                cout<<a[i][j][k]<<"        ";
                                cout<<*(*(*(a+i)+j)+k)<<"        ";
                                cout<<*(*(*(p+i)+j)+k)<<endl;
                        }
                        return 0;
        }

위의 코드 중에서서 p=a; 에 대입하면
p=&a[0][0][0]인데, for문의 cout<<a[j][k]<<"        "; 부분은 그럼 어떻게 되는 건가요?
실행하면 a의 3차원 행렬과 같은 값이 나오는데, 왜 그렇게 되는지 이해를 하지 못해서요,
원래 배열의 특성상 a배열 12개의 값을 갖고 포인터 p배열은 6개를 갖는데 어떻게 출력시 12개의 값을 모두 출력하지요?? 은 부탁드립니다.