C语言中数组和指针结合起来的一个问题,花费你一分钟

来源:百度知道 编辑:UC知道 时间:2024/09/28 03:28:10
我把书上的内容抄下来免得自己表达不清楚造成没人回答。

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++,p++)
printf("%d",*p);
}

如果输入1到10十个数字,输出并不是1到10这十个数。书上的解释是:指针变量的初始值为a数组的首元素的地址,但经过第一个循环读入数据后,p一指向a数组的末尾。因此,在执行第二个for循环时,每次执行p++,因此p指向是a数组下面的10个十个元素,而这些存储单元中的值是不可预料的。 可能书上讲的很详细,但我还是不明白,怎么指针就指向a数组以外的地址了,希望能有好人指导,谢谢

要牢记:指针就是一个地址,执行完第一个for循环后,p的值即为a[]中的最后一个元素的地址,而第二个for循环中,p还在自增,所以p的值已经超过了a[]中最后一个元素的地址,所以指针就指向a数组以外的地址

因为数组的的变量名就是地址起始地址,即a[],a就是了,所以p=a即把a 的地址传给P了,因为P是地址,所以scanf("%d",p++)等以
scanf("%d",&a[i]);有没有注意到a[i]前面的&符号啊,这个是取地址。而printf("%d",*p);你要注意那个*号了,这个是取地址所指向的值,明白了吧

for(i=0;i<10;i++)
scanf("%d",p++);
这里,每输入一个数字,p指向的地址就增加1(其实是增加sizeof(int)=4,因为一个int型变量占用4字节空间)
所以十个数输入完成后p=a+10
要想之后能够正常输出,那再让p指向数组开头就行了,即p=a
for(i=0,p=a;i<10;i++,p++)
printf("%d",*p);