-1
#include <stdlib.h>
#include <stdio.h>

int main(void)
{

int a[]={1,2,3,4,5};
int b[]={0,0,0,0,0};
int *p;
int i;
p=b;
for( i =0 ; i<5 ; i++)
{
    b[i]=a[i]+1;
    *p=b[i]-1;
    printf(" %i \t %i \t %i \n" ,*p,b[i],a[i]);

}
return 0;
}

我希望输出为:

*p   b   a
 1   2   1
 2   3   2
 3   4   3
 4   5   4
 5   6   5

但它显示如下:

*p   b   a
 1   1   1
 2   3   2
 3   4   3
 4   5   4
 5   6   5        

即使我在每个 a[] 中添加 +1。但对于第一次打印,它显示 1 个输出。为什么?

4

4 回答 4

4

要指向的p=b;集合。因此,虽然增加了,但又减少了。pb[0]b[0]b[i]=a[i]+1;*p=b[i]-1;

于 2013-03-05T14:36:51.820 回答
1

问题是:

int a[]={1,2,3,4,5};
int b[]={0,0,0,0,0};
int *p;
int i;
p=b; // <<---- HERE

p指出 array 的第一个元素b,然后在这段代码中:

b[i] = a[i]+1;
*p = b[i]-1;

尽管您将值分配给2第一个元素,*p = b[i]-1;但再次将其重写1,这就是输出第一行的原因:

1 1 1
于 2013-03-05T14:37:46.017 回答
1

这将是您的程序的工作版本:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{

int a[]={1,2,3,4,5};
int b[]={0,0,0,0,0};
int c[]={0,0,0,0,0}; //another array
int *p;
int i;
p=c; // point p to a new array to write to.
for( i =0 ; i<5 ; i++)
{
    b[i]=a[i]+1;
    *p=(b[i]-1);
    printf(" %i \t %i \t %i \n" ,*p,b[i],a[i]);

}
return 0;
}
于 2013-03-05T14:41:46.500 回答
1

关键是设置 p=b。p 和 b 都是指针,这意味着 *p 和 b[0] 都指向同一个数据。

在循环的第一次迭代中,您首先将一个添加到 b[0],然后减去一个。对于以下迭代,*p 仍然与 b[0] 相同,但该值取自更高的索引。

于 2013-03-05T14:46:12.140 回答