Функции языка си могут использоваться рекурсивно, т. е. Функция может явно или косвенно обращаться к себе самой. При каждом вызове будут образовываться новые локальные переменные, совершенно не зависящие от предыдущего набора.
Пример
Обращение строки: asd -> dsa
mirror(char *string)
{
char symbol=*string;
string++;
if (*string!=’\0’)
mirror(string);
putchar(symbol);
}
вызовфункции mirror ввиде mirror(“asd”); приведетквыводунадписи dsa
На первом этапе параметру string будет присвоено значение указателя на знак ‘a’, а переменной symbol – значение ‘a’. После чего произойдет увеличение указателя string и он станет указывать на знак ‘s’. Т. к. * string!=0, то произойдет опять вызов функции mirror.
На втором этапе, образованные новые локальные переменные string и symbol получат соответственно значения указатель на знак ‘s’ и значение ‘s’. После чего произойдет увеличение указателя string и он станет указывать на знак ‘d’. Т. к. * string!=0, то произойдет опять вызов функции mirror.
На третьем этапе, образованные новые локальные переменные string и symbol получат соответственно значения указатель на знак ‘d’ и значение ‘d’. После чего произойдет увеличение указателя string и он станет указывать на знак признак конца строки ‘\0’.
Т. к. * string==’\0’, произойдет переход к выполнению стандартной функции putchar, что приведет к выводу значения переменной symbol, т. е. выводу символа ‘d’.
Закончится выполнение функции.
При возврате с третьего этапа произойдет печать значения переменной symbol, присвоенного ей на втором этапе, т. е. символа ‘s’. А при возврате со второго этапа произойдет печать значения переменной symbol, присвоенного ей на первом этапе, т. е. символа ’a’.
На этом закончится выполнение функции mirror(“asd”);
Назад к разделу "8.9. Место определения и обращения к функции"