非常郁闷的问题 大家来看看

来源:百度知道 编辑:UC知道 时间:2024/06/23 04:29:45
(1)
#include<stdio.h>
void main()
{
int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%d",p++);
printf("\n");
for(i=0;i<10;i++)
printf("%d ",*p);
printf("\n");
}

(2)
#include<stdio.h>
void main()
{
int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%d",p++);
printf("\n");
p=a;
for(i=0;i<10;i++)
printf("%d ",*p++);
printf("\n");
}
让我不解的是这俩程序结果一样
按老潭的说发是经过第一个for
p已指向a数组的末尾在执行第2个
for时p的起始值不是&a[0]了而是
a+10;照这样说第一个程序怎么能正确输出呢
我的编译器是VC6.0,试了N次第一个都能正确
输出,我以为是编译器的事 把编译器的进程结束了在
打开在试还一样,在后来我又把电脑从起了回在试还一样
后来又在TC 2.0上 试 第一个结果不正确
很郁闷 不能解释 高手给看看
VC6.0下我随即输入10个数
输出结果都是 0 1 2 3 4 5 6 7 8 9
怎么第一个程序总是输出0 1 2 3 4 5 6 7 8 9呢
它 要是向 3楼的 大哥输出的 那样 我能够 理解
它 还给我弄的一排 连续的数字 原来我输入的是
0 1 2 3 4

(1)
#include<stdio.h>
void main()
{
int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%d",p++);
printf("\n"); //VC中,这时p指向i的地址
for(i=0;i<10;i++)
printf("%d ",*p);//i再增加,p没有增加,*p就是i
printf("\n");
}

(2)
#include<stdio.h>
void main()
{
int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%d",p++);
printf("\n");
p=a;
for(i=0;i<10;i++)
printf("%d ",*p++);
printf("\n");
}

这两个程序中,(2)是正确的,我就不说了,下面单独说说(1)
TC中输出的结果不对,是正常的,因为p超出了数组a,指向了一个无法预期的地址了
下面再说说VC中为什么输出正确了

VC中,确实像楼主所说,(1)也会输出0 1 2 3 4 5 6 7 8 9
不论输入是什么,输出都是这个结果,为什么呢?
看一下程序就知道了:
int *p,i,a[10];
上面这个声明,先是p,然后是i,再是a
他们在内存中是连续的,比如我用的VC,他们的地址分别为:
&p=0x0012ff7c,i=0x0012ff78,a=0x0012ff50
当执行了第一个循环以后,p指向了i的地址了