有人可以帮我解释一下这个递归函数吗?

标签 c arrays pointers printing recursion

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

void reprint(char *a[]) {
    if(*a) {
            printf("%d ",a);
            reprint(a+1);
            printf("%s ",*a);
    }
}

int main() {
    char *coll[] = {"C", "Objective", "like", "don't", "I", NULL};
    reprint(coll);
    printf("\n");
    return EXIT_SUCCESS;
}

经验丰富的人都知道,这会反向打印数组。我不太明白怎么办!

我需要帮助了解 reprint(char *a[]) 的作用。我在一定程度上理解指针算术,但是通过到处插入 printf,我确定该函数会递增到数组末尾,然后返回到开头,仅在数组上打印一路下来。但是,我不明白它是如何做到这一点的;通过查看实际代码,我设法理解的是,如果 *a 不是 NULL,则在下一个索引处再次调用 reprint。

最佳答案

理解函数输出的关键是它将在递归之前打印指针,以及递归之后打印实际的字符串。这就是给你经历了两次的印象。

也许这听起来很愚蠢,但是手动跟踪程序执行(或使用调试器)。一旦进入重印函数,它将在 printf("%d ",a); 之后调用自身,因此它首先会一路“爬”到 NULL。然后才会遇到printf("%s ",*a);系列。

像这样修改你的程序,它应该可以帮助你理解发生了什么。

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

static int callcounter = 1;

void reprint(char *a[]) {
    printf ("Entering reprint for the %d time\n",callcounter++);
    if(*a) {
            printf("%p ",a);
            reprint(a+1);
            printf("%s ",*a);
    }
    printf ("Exiting reprint\n");
}

int main() {
    char *coll[] = {"C", "Objective", "like", "don't", "I", NULL};
    reprint(coll);
    printf("\n");
    return EXIT_SUCCESS;
}

关于有人可以帮我解释一下这个递归函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10967785/

相关文章:

c - 为库函数定义 errno 值

c# - 如何在C#中用指针调用C语言编码的dll

c 指针,如何将它/它们释放到一个函数中

c - 无法使用c打开文件

arrays - 时间复杂度 : Findning the mode of an array

c# - 替代 C# 中的二维数组

c++ - 列出数组未转换为指向单个元素的指针的所有情况?

c++ - 运算符优先级困惑

c - c中的指针和数组有什么区别?

c - 使用 arm-linux-gnueabi-gcc 交叉编译 ARMv6l 的标志