C语言二维数组指针问题

如下两个代码,第一个代码会停止运行,而第二个能得出正确结果。。。这两个代码的不同之处不应该是等价的吗?为什么会造成这种完全相反的结果?

 #include<stdio.h>
void main()
{
    void ave(float *p,int m);
    float a[3][4]={{65,66,67,68},{78,79,80,71},{54,78,65,54}};
    ave(*a,12);
}

void ave(float *p,int m)
{
    float aver=0;
    for(;p<(p+m);p++)       //与下一个代码的不同之处
        aver=aver+(*p);
    aver=aver/m;
    printf("平均分为:%4.2f\n",aver);
}
 #include<stdio.h>
void main()
{
    void ave(float *p,int m);
    float a[3][4]={{65,66,67,68},{78,79,80,71},{54,78,65,54}};
    ave(*a,12);
}

void ave(float *p,int m)
{
    float aver=0;
    float *end=p+m;       //与上个代码的不同之处
    for(;p<end;p++)
        aver=aver+(*p);
    aver=aver/m;
    printf("平均分为:%4.2f\n",aver);
}

p<(p+m)
可是p每次都在变,所以这个条件每次都不一样

 #include<stdio.h>
void main()
{
    void ave(float *p,int m);
    float a[3][4]={{65,66,67,68},{78,79,80,71},{54,78,65,54}};
    ave(*a,12);
}

void ave(float *p,int m)
{
    float aver=0;
    float *q=p;
    for(;p<(q+m);p++)       //与下一个代码的不同之处
        aver=aver+(*p);
    aver=aver/m;
    printf("平均分为:%4.2f\n",aver);
}

难道是因为第一个传进来的数组名是一个常量指针,不能做++等改变位置的操作

(p+m)这个p只是指向二维数组里边的一维数组的首地址,p+1,第一次指向65,p再+1应该是指向78
二维数组至少得俩for循环使用

#if 1
#include
void main()
{
void ave(float *p, int m);
float a[3][4] = { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } };
ave(*a, 12);
}

void ave(float *p, int m)
{
float aver = 0;
//float *end = p + m; //与上个代码的不同之处
for (; p<(p+m); p++) //这种情况你的p指针后移,p+m指针也跟着后移,永远追不上,导致死循环,
aver = aver + (*p);
aver = aver / m;
printf("平均分为:%4.2f\n", aver);
}
#endif