鱼C论坛

 找回密码
 立即注册
查看: 4462|回复: 6

用指针倒序输出

[复制链接]
发表于 2012-4-17 23:21:03 | 显示全部楼层 |阅读模式
2鱼币
这是一个倒序输出的程序,想不明白为什么在输出的时候要用p--后才能正常输出,不用的话会把a[10]的值输出两遍,求解释.
#include <stdio.h>
void main()
{
int *p, i, a[10];
p = a;
for(i=0; i<10; i++)
{
  scanf("%d", p++);
}
printf("\n");
for(p--,i=0; i<10; i++) // 用p--后,程序才能倒序输出原先输入的10个数,Why?
{
  printf("%d\n", *(p--));
}

}

最佳答案

查看完整内容

首先如果不用p--时,应该是输出a[10]十次,改成应该十分明了了 #include void main() { int *p, i, a[10]; p = a; for(i=0; i
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-17 23:21:04 | 显示全部楼层
首先如果不用p--时,应该是输出a[10]十次,改成应该十分明了了
#include <stdio.h>
void main()
{
int *p, i, a[10];
p = a;
for(i=0; i<10; i++)
{
  scanf("%d", p++);
}
printf("\n");
p--;
for(i=0; i<10; i++) // 用p--后,程序才能倒序输出原先输入的10个数,Why?
{
  printf("%d\n", *(p--));
}
}
第一个for循环最后一次获取a[9]后p++,指针指向了a[9]的下一个内存单元的地址。
所以为使指针从a[9]循环输出到a[0],故p应p--指向了a[9]
第三个循环从a[9]循环输出到a[0],最后p的地址应是a[0]的上一位。
建议断点调试看一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-17 23:51:55 | 显示全部楼层
因为这句  printf("%d\n", *(p--)); 里面的 p-- 是 和 *结合 后再自减的。
也可以改成这样:
  1. #include <stdio.h>
  2. void main()
  3. {
  4. int *p, i, a[10];
  5. p = a;
  6. for(i=0; i<10; i++)
  7. {
  8.    scanf("%d", p++);
  9. }
  10. printf("\n");
  11. for(i=0; i<10; i++)
  12. {
  13.          p--;
  14.          printf("%d\n", *p);
  15. }

  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-18 12:13:31 | 显示全部楼层
本帖最后由 笑着流泪 于 2012-4-18 12:15 编辑


第一个for循环结束后指针的地址是指向了a[9]的下一个内存单元,
但我如果没有加p--,为什么结果会把a[9]的值输出两遍,而没有输出a[0]的值,
a[9]的下一个内存单元应该是没有赋值的才对,我也自己调试过,就是有点想不通,
还望指教。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-19 00:25:48 | 显示全部楼层
本帖最后由 .丶For_、 于 2012-4-19 00:27 编辑

for(i=0; i<10; i++)
{
  scanf("%d", p++);
}
这里输入结束后,p指在最后一个数据的后面,所以必须用 p-- ,--p 什么的让p指向最后输入的一个数据
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-20 19:44:04 | 显示全部楼层
把以上程序里的10都改为1,自己想想就明白了。
  1. #include <stdio.h>
  2. void main()
  3. {
  4.         int *p, i, a[1];
  5.         p = a;
  6.         for(i=0; i<1; i++)
  7.         {
  8.                 scanf("%d", p++);
  9.         }
  10.         printf("\n");
  11.         for(p--,i=0; i<1; i++) // 用p--后,程序才能倒序输出原先输入的1个数,Why?
  12.         {
  13.                 printf("%d\n", *(p--));
  14.         }
  15.        
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-4 13:04:03 | 显示全部楼层
因为在输入十个数时,for 循环在进行最后一次时,p是后++,所以当跳出for循环后,p又自加了一次,因而p指向了a[9]的后面一个内存单元,所以在进行倒叙输出时,p应该先自减一次!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-12 21:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表