这是一本书的示例片段。我不明白它是如何反向打印字符串的。第一次调用reverse
时,假定输入了有效的字符串,则0处的元素不为null。在else
语句中,我们再次调用该函数,并传入索引1处的元素地址。
因此,假设我输入了"hello"
。然后,我传递了e
的地址。第二次调用reverse
时,如何遍历字符串?正在检查的索引仍然为1。另外,在我看来,我们没有替换数组的值。当我们开始使用putchar
打印值时,我感到非常困惑,以至于索引0处的值从数组的最后一个元素开始。我知道,当我们使用递归并遇到基本情况时,由于这些项都放在堆栈中,因此我们从堆栈指针的顶部开始读取它们,直到结尾为止,这就是为什么相反的原因。但是在这里我看不到这种情况。
位于
的硬编码索引reverse( &ptr[1]);
putchar(ptr[0]);
对我来说没有意义。我想我很难在每次递归中传递相同的地址时看到字符串如何遍历。请帮助我了解发生了什么。
为了简单起见,我对代码进行了一些修改,但是它所做的与书中的代码相同。
#include <stdio.h>
void reverse(char * ptr);
int main(){
char sentence[10];
printf("enter text \n");
fgets(sentence, 10, stdin);
printf("The line is: \n");
reverse(sentence);
return 0;
}
void reverse( char * ptr){
if(ptr[0] == '\0'){
return;
} else{
reverse( &ptr[1]);
putchar(ptr[0]);
printf("\n");
}
}
答案 0 :(得分:0)
&ptr[1]
等效于ptr + 1
。现在,如果您将ptr
视为一个数字(实际上是一个数字),那么很明显,每次传递的数字都不相同,而是递归的每个数字都更大。它基本上是从第二个字符开始传递一个子字符串,只是在C中,该子字符串不是一个单独的对象,而是一个指向同一字符串中不同位置的指针。