请问下面的代码为什么无法打印出依次数组元素的值?

在研究指针的指针过程中,用一个数组的指针pt1指向数组,再用一个指针指pt2向这个指针,为什么通过pt2无法获取数组元素的值
int a[5]={ 1,2,3,4,5 }; //定义一个一维数组 a
         int  (*pt1)[5];      // 步长为 5 的数组指针,即 prt 指向的数组里有 5 个元素  
         pt1=&a;//给数组指针赋值:数组的地址
         int **pt2;//定义一个指针的指针;
         pt2 =(int **)&pt1;//pt2存储pt1这个变量的地址
         int i =0;
         for(; i < 5;i++){

                 printf("a[%d] = %d\n",(**pt2)[i]);
         }
printf("a[%d] = %d\n",**pt2[i]); 这一行报错:大概意思“["前面既不是指针,也不是变量,也不是vector;
(pt2)[i])就表示数组中各元素的值,pt2中存储的是pt1的地址,*pt2就表示取得pt1这个变量的地址对应的值,它就是数组a的地址,pt2就表示这个数组,自然最后(**pt2)[i]就能表示数组元素的值;
难道是因为指针的指针定义的时候没有指定步长,之后给它赋值的时候又进行了强制类型转换成了步长为一个元素的指针,所以最终**pt2无法代表数组;解决的办法是将pt2的步长也定义为5吗 ,int **pt2[5]?这样是不是太麻烦了,我就想用一下指针的指针求出指针所指向的变量的值;

printf("a[%d] = %d\n"**,****pt2[i]); 这一行报错,缺了a[%d] 这个%d 的参数,pt2[i] 表达式也有误,修改如下:

#include <stdio.h>
int main()
{
    int a[5] = { 1,2,3,4,5 }; //定义一个一维数组 a
    int(*pt1)[5];// 步长为 5 的数组指针,即 prt 指向的数组里有 5 个元素  
    pt1 = &a;//给数组指针赋值:数组的地址
    int** pt2;//定义一个指针的指针;
    pt2 = (int**)&pt1;//pt2存储pt1这个变量的地址
    int i = 0;
    for (; i < 5; i++) {
        printf("a[%d] = %d\n", i, **pt2 + i);//*(*pt2 + i));
        //printf("a[%d] = %d\n",(**pt2)[i]);
    }
    return 0;
}

改为这样子试下:*(pt2+i)