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.
理解函数输出的关键是它将在递归之前打印指针,并在递归之后打印实际的字符串.这就是给你两次经历的印象.
也许这听起来很愚蠢,但可以手动执行程序(或使用调试器).一旦它进入重新打印功能,它将在它之后打一个自己的调用,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)