#include<stdio.h>
void testfunc(int);
int main(void)
{
testfunc(1);
return 0;
}
void testfunc(int n)
{
printf("Lv%d:%p\n",n,&n); //%p 地址顯示格式
if(n<4)
{
testfunc(n+1); //testfunc()調用了自己
}
printf("2Lv%d:%p\n",n,&n);
}
以上是一個遞歸的示例。
testfunc()在內部調用了自己,這樣的后果是:暫時不執行最后面的“printf("2Lv%d:%p\n",n,&n);”,而是將 n+1作為參數調用了自己,這樣重復,最終程序的結果是:

(根據電腦不同,地址可能有所不同)
程序具體運行步驟:
1.main()調用testfunc(1)
2.testfunc(1)執行,打印“lv1:0022FF60”,0022FF60是n的地址
3.n<4,條件成立, testfunc(1)調用testfunc(2)
4.testfunc(2)執行,打印“lv1:0022FF40”,因為此時testfunc(2)的變量n已經不是testfunc(1)中的變量n了,所以地址不同。(函數的參數作用域只在當前函數)
5.n<4,條件成立,testfunc(2)調用testfunc(3)
6.testfunc(3)執行,打印“lv1:0022FF20”
7.n<4,條件成立,testfunc(3)調用testfunc(4)
8.testfunc(4)執行,打印“lv1:0022FF00”
9.n<4,條件不成立,打印“2lv1:0022FF00”
10.返回調用testfunc(4)的testfunc(3),打印“2lv1:0022FF20”
11.返回調用testfunc(3)的testfunc(2),打印“2lv1:0022FF40”
12.返回調用testfunc(2)的testfunc(1),打印“2lv1:0022FF60”
OK,這就是函數的遞歸調用,通俗的說就是函數自己調用自己。以前學時沒有弄明白,現在終于弄明白了。