Потому что c+1
делает не меняет c
, тогда как ++c
делает.
Подумайте об этом, когда c
указывает на адрес 1234
:
reverse(++c); // c is now 1235 and you pass that.
printf("%c", *c); // so we print the second character at 1235.
С версией c+1
:
reverse(c+1); // c is still 1234 but you pass 1235.
printf("%c", *c); // so we print the first character at 1234.
Для чего бы то ни было, ваша функция reverse
неоправданно сложна. else return
избыточнаи я лично предпочитаю рекурсивные вызовы, которые сначала проверяют условия завершения, так как я часто обнаруживал, что компиляторам обычно проще выполнять хвостовую оптимизацию рекурсии.
Следующая полная тестовая программа показывает, как ясделайте это:
#include <stdio.h>
void reverse (char *c) {
if (*c == '\0') return;
reverse (c + 1);
putchar (*c);
}
int main (int argc, char *argv[]) {
int i;
for (i = 1; i < argc; i++) {
reverse (argv[i]);
putchar ('\n');
}
return 0;
}
Запуск этого с testprog hello goodbye
даст вам:
olleh
eybdoog