2 ly666888555 ly666888555 于 2016.01.21 20:49 提问

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);
}

5个回答

devmiao
devmiao   Ds   Rxr 2016.01.21 20:52
已采纳

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

ly666888555
ly666888555 受教了,谢谢,,,糊涂了,忘记它会变/(ㄒoㄒ)/~~
接近 2 年之前 回复
devmiao
devmiao   Ds   Rxr 2016.01.21 20:53
 #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);
}
91program
91program   Ds   Rxr 2016.01.21 20:55

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

ly666888555
ly666888555 问题就和苏小喵姐姐说的一样
接近 2 年之前 回复
ncbh123
ncbh123   2016.01.22 10:27

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

John_ToStr
John_ToStr   Rxr 2016.01.23 16:34

#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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!