鱼C论坛

 找回密码
 立即注册
查看: 1778|回复: 4

[已解决]二级指针输出以及循环输出求助

[复制链接]
发表于 2017-11-22 15:01:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么我的这个程序,这么写输出的时候少输出一个字母s
  1. #include<stdio.h>
  2.   9 #include<stdlib.h>
  3. 10
  4. 11
  5. 12 int main(void)
  6. 13 {
  7. 14         char *ing[5];
  8. 15         char *name = "shi";
  9. 16         char *fers = "jinl";
  10. 17         char *hello = "nishi";
  11. 18         char *nnw = "nihao";
  12. 19         char *haod = "woshi";
  13. 20
  14. 21         ing[0] = name;
  15. 22         ing[1] = fers;
  16. 23         ing[2] = hello;
  17. 24         ing[3] = nnw;
  18. 25         ing[4] = haod;
  19. 26
  20. 27
  21. 28         while (**ing - 1 != '\0')
  22. 29         {
  23. 30                 *(*ing)++;
  24. 31                 printf("%c", **ing);
  25. 32         }
  26. 33
  27. 34         return 0;
  28. 35 }
复制代码


这么写却不会少输出s呢
  1. int main(void)
  2. 13 {
  3. 14         char *ing[5];
  4. 15         char *name = "shi";
  5. 16         char *fers = "jinl";
  6. 17         char *hello = "nishi";
  7. 18         char *nnw = "nihao";
  8. 19         char *haod = "woshi";
  9. 20
  10. 21         ing[0] = name;
  11. 22         ing[1] = fers;
  12. 23         ing[2] = hello;
  13. 24         ing[3] = nnw;
  14. 25         ing[4] = haod;
  15. 26
  16. 27
  17. 28         while (**ing - 1 != '\0')
  18. 29         {
  19. 30                 printf("%c", *(*ing)++);
  20. 31         }
  21. 32
  22. 33         return 0;
  23. 34 }
复制代码

这里面更改的地方是while循环那个地方
求大神给指点
还有如果能德华能顺道说一下,为什么二级指针循环哪里需要减一呢,我只是通过实验弄成减一是可行的,但是原理我我从网上没有查到什么还请大神给指点
最佳答案
2017-11-22 16:14:20
首先,你这个写法就很有问题,应该说是不能这样写的。还是给你解释一下,第一个程序:**ing 指向 “shi”字符串中的第一个字符‘s’,
所以**ing - 1并没有什么意义,循环不会退出,*(*ing)++后,这时**ing 指向“shi”中的第二个字符'h',后面才printf,所以第一个程序不会显示字符‘s’;第二个程序可以打出's',是因为*(*ing)++会在printf之后执行。给你个实现的代码吧。
  1. for (int i = 0; i < 5; i++)
  2.         {
  3.                 *ing = ing[i];                       
  4.                 while (**ing != '\0')
  5.                 {
  6.                         printf("%c", *(*ing)++);
  7.                 }
  8.                 printf("\r\n");
  9.         }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-22 15:48:28 From FishC Mobile | 显示全部楼层
指针自增的问题
实际输出时应该先输出再自增,而不是先自增再输出
为什么需要-1
因为循环体内的自增操作会将指针指向下一个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-22 16:14:20 | 显示全部楼层    本楼为最佳答案   
首先,你这个写法就很有问题,应该说是不能这样写的。还是给你解释一下,第一个程序:**ing 指向 “shi”字符串中的第一个字符‘s’,
所以**ing - 1并没有什么意义,循环不会退出,*(*ing)++后,这时**ing 指向“shi”中的第二个字符'h',后面才printf,所以第一个程序不会显示字符‘s’;第二个程序可以打出's',是因为*(*ing)++会在printf之后执行。给你个实现的代码吧。
  1. for (int i = 0; i < 5; i++)
  2.         {
  3.                 *ing = ing[i];                       
  4.                 while (**ing != '\0')
  5.                 {
  6.                         printf("%c", *(*ing)++);
  7.                 }
  8.                 printf("\r\n");
  9.         }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-23 12:32:27 | 显示全部楼层
上善若水··· 发表于 2017-11-22 16:14
首先,你这个写法就很有问题,应该说是不能这样写的。还是给你解释一下,第一个程序:**ing 指向 “shi”字 ...

为什么你这个指针地址可以传给指针呢?*ing = ing;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 09:25:01 | 显示全部楼层
奥普瓯江 发表于 2017-11-23 12:32
为什么你这个指针地址可以传给指针呢?*ing = ing;

因为它们都是地址,你可以将他们看成一个int(其是它的本制就是一个unsigned int), int (*ing) 和 int ing,是不是可以直接赋值呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 00:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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