#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。

最佳答案

理解这种类型的递归的关键是要知道堆栈是如何工作的。

首先:每次reprint()用(a + 1)调用自身,然后将a + 1压入堆栈。这意味着被调用的reprint()获得char **的副本作为参数。呼叫重印的“ a”未触及。就像您说的那样,直到传递的char **为NULL(即数组中的最后一个元素)为止。然后,测试'if(* a)'变为假,重印不会被更深地称为。

请注意,此时,所有5个对reprint的调用都在“等待”以使其返回,因此,递归调用reprint之后的所有printf都还没有被调用。还要注意,所有5个调用都有自己的“ a”指针。这是必不可少的。

现在,由于上次重印调用不再调用重印,因此它将返回。倒数第二次重印,即带有“ a”的字符串“ I”,可以在重印调用后继续执行下一个语句,即“ I”的printf。完成此操作后,此函数也会返回。最后倒数第三次重印,即带有“ a”的字符串“ do't”也可以继续并打印“ do n't”,依此类推。

09-28 12:35