C语言初学者我不明白 帮帮我!~~

来源:百度知道 编辑:UC知道 时间:2024/05/31 10:09:08
main()
{
int *p,i,a[5];
p=a;
for(i=0;i<5;i++)
*p++=i; /*循环结束p的指向已超出了a数组*/
p=a;
for(i=0;i<5;i++)
printf("a[%d]=%d\n",i,*p++);
}
问题:为什么说FOR循环结束p的指向已超出了a数组,p++不是最多指向到a[4]i,5结束了循环了啊
问题2:我用F8一步一步看了p的值的变化,:DS:FFD6然后变成FFD0这都是什么值啊?不要笑我是初学,这个像是16进制的数让我无法认识p在循环中的变化过程
问题3:定义个a[5]那a+3是地址还是什么?是不是相当于&a[3]?
请说详细明白点 谢谢各位啦~

1:i从0到4,执行了5次,p也+了5次,自然越界

2:FFD6这些是地址,也就是数组a的元素存在内存中的地址,一般情况不需要了解他们

3:你说的没错,a是首地址,a+3就是从a开始加3的地址,也就是&a[3]

问题一:for循环结束时,p已经指向已经超出了数组,第一次循环时p开始指向a[0](因为是后置加加)运行完后p指向 a[1],同理,第五次循环时p指向 a[4],运行完后p指向a[5],但此时i等于5,退出循环
问题二:你调试的是编绎后的汇编指令,肯定看不明白了,你应该选择单步调试,不要选择跟踪子程序,要不会进到那个里面会是汇编指令,很难看明白,
问题三: a+3是地址,等于&a[3]

问题1:p指向a[4]但是然后又自加一次,所以越界
问题2:FFD6等都是你电脑的内存地址,*p才是指向的数据
问题3:a+3相当于a&[3]就是指针*a所指向的地址的后3位
clear?

问题1,因为p 最多可以是4,而p=4时,p++==5;
问题3,应该就是&a[3]