C语言一道题目分析程序运行过程,将数组a中的n个整数按相反顺序存放 ,求解释!

void inv(int *x, int n)
{ int t,*p,*i,*j,m=(n-1)/2;
i=x; j=x+n-1; p=x+m;
for(;i<=p;i++,j--)
{ t=*i; *i=*j; *j=t; }
}
main()
{ int i,a[10]={3,7,9,11,0,6,7,5,4,2};
inv(a,10);
printf("The array has been reverted:\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
}

程序如上,可是为什么inv中的for循环里for(;i<=p;i++,j--)这样写也可以,不明白!求专家解释!

首先一点 这个确实是可以的

问题是 写的太绕了 让人看着别扭。 


看初始值。 

int t,*p,*i,*j,m=(n-1)/2;

m就是中点。

    i=x;  j=x+n-1;  p=x+m;

i是开头 j是结尾。 p是中点

然后

for(;i<=p;i++,j--)

for用分号分隔的三个域。第一个空,也就是不用初始化值。 因为之前已经做过了

第二个 i<=p 也就是i>p 当前面一个指针 指到中点后面 退出循环。 

第三个 改变 i++,j--

也就是两头凑。 前面向后移动,后面向前移动。 这样 就实现了两端向中间的一个遍历。 

实现了倒序。 


其实 更简单的是

void inv(int  *x, int n)
{   int t,*i,*j;
    i=x;  j=x+n-1;
    for(;i<j;i++,j--)
    {  t=*i;  *i=*j;  *j=t; }
}

这样更直观  æ›´ç®€å•ã€‚ 

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-09-30
这是因为前面已经赋值:
i=x; j=x+n-1;p=x+m;
所以,for(;i<=p;i++,j--)
就相当于:
for(i=x,j=x+n-1;i<=x+(n-1)/2;i++,j--)
总的循环次数为1+(n-1)/2次,每次交换首尾一对数后,i,j相向各自移动一位。所以,这循环就使得x[0]~x[n-1]的元素全部逆置了。
第2个回答  2017-09-10
那么瞎回答的,结果就是 2 4 5 7 6 0 11 9 7 3

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网