这个为什么可以逆序输出呀?

这个函数可以让p逆序输出,为什么呀?救命,求解答!

void fan(char*p,int i)
{
if(p[i+1]!='\0')
fan(p,i+1);
printf("%c",p[i]);
}

你提的这个问题还是很好的,这个是个经典的递归调用,理解完这个函数,那么你的递归函数就基本没问题了。。。。
我们在学习C 语言函数调用的时候,只是看到一行一行的调用,但是程序在编译成机器码之后才能运行的,如果你学过汇编就可以知道,遇到函数调用之后,机器码会为了产生一个跳转。
例如,你这个函数当if 成立之后会再次进入fan(),那么这就会jump 到函数fan 的地方继续执行,这样下去,每次if 进来都会进入fan 地址进行运行(当然每次的参数都是不同的)。当你一直到最后一次fan(),发现if 无法满足了,那么只好打印这一次fan() 的最后一个函数跳转,即printf 函数跳转。这里是你程序的第一次打印哦。。。

以此类推,当最后一次fan() 跳出回到上一次跳转地方就会发现倒数第二次的fan() 中还有个printf。。。。以此类推。。。一直到第一次fan() 的printf执行。。。。
所以,当你运行的时候就会发现是倒序输出。。。。
希望对你有帮助,很高兴你加入C 语言大家庭,有问题欢迎随时交流。。。。

递归

假如你有一层楼,你去挨个屋收租
你想先从住在最里面的那一户开始收,避免收完租回头还要再面对他们一次
所以你挨个门牌号看过去,是最后一个吗?不是,不是留着,下一个(i+1)
一直找到最后一个,开始收(printf)
收一个,往后退一步,收上一家
一直退到门口,出门

最开始的fan函数还没执行完,就要先执行里面的fan函数,依次递归,直到最后一位(if(p[i+1]!='\0'))开始输出。

您好,这个是递归的使用,了解递归函数的运行机制就明白为啥可以逆序输出了,函数调用是一层一层调用,当限制条件到达时在一层一层退出,这样的一个关系,就导致最终是逆序输出的