【问题标题】:Trying to understand a program in C试图理解 C 中的程序
【发布时间】:2016-10-15 14:18:14
【问题描述】:

我试图用 C 语言理解这种程序,但我不能。确切地说,我不知道 *s 是如何改变的,以及为什么编译器显示 210012。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void WhatIamDoing(char *s) {
    char ch;
    if (*s) {
        ch = *s;
        s++;
        WhatIamDoing(s);
        putchar(ch);
    }
}


int main() {
        char s[20] = "012" ;
        WhatIamDoing(s) ;
        printf( "%s", s ) ;
}

【问题讨论】:

  • 对不起。这不是“解释代码”或辅导网站。见How to Ask
  • @Olaf 谁说的?
  • 你听说过递归吗?特别是关于头递归
  • "compiler shows 210012" --> 你的输出不包括lk吗?建议准确发布输出。
  • @chux 我这样做是为了调试。

标签: c function pointers recursion


【解决方案1】:

我认为这样想很容易。在 void 函数中,char *s 是一个指向 char 变量或字符数组的指针。在您的情况下,它指向 char 数组 s[20]="012"。在WhatIamDoing 函数中,s 指向'0' 字符并分配给char ch 变量。然后s++ 现在's' 指向字符'1'。你再次调用函数WhatIamDoing(s),它也会发生同样的情况(这就像一个递归函数)并且在最后一个WhatIamDoing(s)char ch 被分配为'2'。完成所有字符后,(最后是空字符)如果条件为假。在命令putchar 的最后一个函数中,您打印'2' 然后'1' 然后'0'。这意味着在您运行 WhatIamDoing 函数后,您会以相反的顺序打印 char 数组。在 main 函数中,您再次打印 s 字符串。那么你得到"210021"。希望你明白。

【讨论】:

  • 因此,当 *s 指向 Null 时,如果条件为 false。但是为什么要以反向模式打印数组呢?
  • 答案中对此进行了解释-putchar 以相反的顺序打印字符串的字符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
相关资源
最近更新 更多