例10.6通过指针变量输出a数组的10个元素。
有人编写出以下程序:
main()
{
intp,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%D",p++);
printf("\n");
for(i=0;i<10;i++,p++)
printf("%D",p);
}
这个程序乍看起来好像没有什么问题。有的人即使已被告知此程序有问题,还是找不出它有什么问题。我们先看一下运行情况:
1 2 3 4 5 6 7 8 9 0
22153 234 0 0 30036 25202 11631 8259 8237 28483
显然输出的数值并不是a数组中各元素的值。原因是指针变量的初始值为a数组首地址(见图9.14中的①),但经过第一个for循环读入数据后,p已指向a 数组的末尾(见图9.14中②)。因此,在执行第二个for循环时,p的起始值不是&a[0]了,而是a+10。
因为执行循环时,每次要执行p++,p指向的是a数组下面的10个元素,而这些存储单元中的值是不可预料的。图9.14p=a;解决这个问题的办法,只要在第二个for循环之前加一个赋值语句:使p的初始值回到&a[0],这样结果就对了。
main()
{
intp,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%D",p++);
printf("\n");
p=a;
for(i=0;i<10;i++,p++)
printf("%D ",p);
}
运行情况如下:
1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0
有人编写出以下程序:
main()
{
intp,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%D",p++);
printf("\n");
for(i=0;i<10;i++,p++)
printf("%D",p);
}
这个程序乍看起来好像没有什么问题。有的人即使已被告知此程序有问题,还是找不出它有什么问题。我们先看一下运行情况:
1 2 3 4 5 6 7 8 9 0
22153 234 0 0 30036 25202 11631 8259 8237 28483
显然输出的数值并不是a数组中各元素的值。原因是指针变量的初始值为a数组首地址(见图9.14中的①),但经过第一个for循环读入数据后,p已指向a 数组的末尾(见图9.14中②)。因此,在执行第二个for循环时,p的起始值不是&a[0]了,而是a+10。
因为执行循环时,每次要执行p++,p指向的是a数组下面的10个元素,而这些存储单元中的值是不可预料的。图9.14p=a;解决这个问题的办法,只要在第二个for循环之前加一个赋值语句:使p的初始值回到&a[0],这样结果就对了。
main()
{
intp,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%D",p++);
printf("\n");
p=a;
for(i=0;i<10;i++,p++)
printf("%D ",p);
}
运行情况如下:
1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0