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

Tha*_*los 2 c printing arrays recursion pointers

#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;
}
Run Code Online (Sandbox Code Playgroud)

正如经验丰富的人所知,这会反过来打印阵列.我不太明白怎么做!

我需要帮助了解是什么reprint(char *a[]).我理解指针算术的程度,但是从插入printfs到此处,我已经确定函数递增到数组结束,然后返回到开始,只在向下打印.但是,我不明白它是如何做到的; 通过查看实际代码我已经设法理解的是,如果*a不是NULL,那么在下一个索引再次调用reprint.

fvu*_*fvu 6

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

也许这听起来很愚蠢,但可以手动执行程序(或使用调试器).一旦它进入重新打印功能,它将在它之后打一个自己的调用,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;
}
Run Code Online (Sandbox Code Playgroud)