二维数组定义方式的不同而导致打印时出现问题

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%

#include

int main(int argc, char** argv){
    int a[3]={1,2,3};
    int b[3]={4,5,6};
    int c[3]={7,8,9};
    int* p0[3]={a,b,c};
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++)
            printf("%d  ",*(*p0+3*i+j));
        printf("\n");
    }
    printf("\n");
    printf("\n");    
    int p1[3][3]={
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++)
            printf("%d  ",*(*p1+3*i+j));
        printf("\n");
    }
}
运行结果及详细报错内容

img

我的解答思路和尝试过的方法

问题发现在数组的定义上,如果是直接定义二维数组,那么结果是正确的;如果改用指针数组的定义方式,结果是错误的
当然还有一点就是,如果p0数组改用别的输出方式,如下

printf("%d  ",*(p0[i]+j));
printf("%d  ",p0[i][j]);

那么结果也是正确的

我想要达到的结果

想知道其内部的原理!

代码中的2个输出都不对

printf("%d  ", *(*(p0 +  i) + j));

这是对我回答不满意啊。道理都跟你说明白了,你不信那也是没办法。有时间跟你们老师确认一下吧,看看我说的对不对