求解int(*p)[4]=(int(*)[4])m;这部分的意思是什么,为什么运行结果是个7

#include <stdio.h>
int main()
{
    int m []={1,2,3,4,5,6,7,8,9,0};
    int(*p)[4]=(int(*)[4])m;
    printf(“%d”,p[1][2]);
    return 0;
}

p是行指针,(int(*)[4])是格式类型转换,目的是为了把一维数组m强行转化成二维数组。因为这个二维数组的第二维大小为4,但是你的m中的元素个数为10,那么你的一维大小为10/4+1=3,即int (*p)[4] 相当于int p[3][4]={{1,2,3,4},{5,6,7,8},{9,0}}

所以p[1][2]=7

int m []={1,2,3,4,5,6,7,8,9,0};

int(*p)[4]=(int(*)[4])m;

p是一个指针,[4]表示在p中存放的数据按照4个一组拆开存放,所以通过m给p赋值后p指向的地址中存放的数据格式为:{(1,2,3,4),(5,6,7,8),(9,0)},相当于一个二维数组:

1 2 3 4

5 6 7 8

9 0      

所以输出p[1][2]就是第二行第三列的值 7

int main()
{
    int m []={1,2,3,4,5,6,7,8,9,0};     //整型的一维数组
    int(*p)[4]=(int(*)[4])m;                //int(*p)[4],这是一个数组指针(也称行指针)。()优先级高,首先说明p是一个指针,指向一个整型的一维数组,

                                                      //这个一维数组的长度是4,也可以说是p的步长。也就是说执行p+1时,p要跨过4个整型数据的长度。

                                                     //(int(*)[4])m 这里是将一维数组强制转化为数组指针
    printf(“%d”,p[1][2]);                  //如上面所说p+1时,p要跨过4个整型数据的长度,也就是所p[1][0]指向了“5”这里。所以p[1][2]指向的是7。

                                                   //从这里也可以看出数组指针为什么也叫行指针,p++,指向的是下一行。
    return 0;
}

debug时,我们可以清楚的看到这个过程,如下图: