|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 boot 于 2017-10-1 19:52 编辑
小甲鱼老师讲过,下面这个是错误的,许多人的答案是在第二个for语句进行指针*p的初始化。
- #include "stdio.h"
- int main()
- {
- int *p, i, a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
- for(i = 0; i < 10; i++)
- {
- p = &a[i];
- p++;
- }
- for(i = 0; i < 10; i++, p++)
- {
- printf("a[%d] = %d\n", i, *p);
- }
- return 0;
- }
复制代码
但我又发现这个:我在第二个//for(i = 0; i < 10; i++)//这里我把p++去掉了,结果最后正常输出了数组里的元素
- #include "stdio.h"
- int main()
- {
- int *p, i, a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
- for(i = 0; i < 10; i++)
- {
- p = &a[i];
- p++;
- }
- for(i = 0; i < 10; i++)//这里我把p++去掉了,结果最后正常输出了数组里的元素
- {
- printf("a[%d] = %d\n", i, *p);
- }
- return 0;
- }
复制代码
本帖最后由 ravenhu13 于 2017-10-3 07:06 编辑
楼主代码可以运行0至9??不明觉厉,第一眼看代码就觉得有问题,因为P的值是固定的,无论怎么打印*P都必须是同一个值,也就是你的循环打印*P这里不可能打印出不同的值,楼主你确定你没剪切错代码??
- #include "stdio.h"
- int main()
- {
- int *p, i, a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
- for(i = 0; i < 10; i++)
- {
- p = &a[i];
- p++;
- }
- /////////////////下面的这个P就没变过,怎么可能打印出不同的值??///////////////
- for(i = 0; i < 10; i++)//这里我把p++去掉了,结果最后正常输出了数组里的元素
- {
- printf("a[%d] = %d\n", i, *p);
- }
- return 0;
- }
复制代码
正确的代码应该如下:
- int *p, i, a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
- //下面是个没有意义的循环,最终*P等于a[10](题目里的数组下标最多只到a[9]),这就是经典的数组越界,这个时候引用*p将会产生不可预计后果。
- for (i = 0; i < 10; i++)
- {
- p = &a[i];
- p++;
- }
- //重新纠正p的地址。
- p = &a[0];
- for (i = 0; i < 10; i++,p++)
- {
- printf("a[%d] = %d\n", i, *p);
- }
复制代码
|
-
如图所示,正常输出
|