#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
即使我在每个[]中添加+1。但对于第一次打印,它显示1输出。为什么?
答案 0 :(得分:4)
p=b;
设置p
以指向b[0]
。因此,虽然b[0]
增加b[i]=a[i]+1;
,但它会递减*p=b[i]-1;
。
答案 1 :(得分:1)
问题是:
int a[]={1,2,3,4,5};
int b[]={0,0,0,0,0};
int *p;
int i;
p=b; // <<---- HERE
你使p
指向数组b
的第一个元素,然后在此代码中:
b[i] = a[i]+1;
*p = b[i]-1;
虽然您将值2
分配给第一个元素,*p = b[i]-1;
会再次使用1
重写它,这就是输出的第一行是:
1 1 1
答案 2 :(得分: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;
}
答案 3 :(得分:1)
关键是设置p = b。 p和b都是指针,这意味着* p和b [0]都指的是相同的数据。
在循环的第一次迭代中,首先将一个添加到b [0]然后再减去一个。对于以下迭代,* p仍然与b [0]相同,但该值取自较高的索引。