我不明白为什么此代码有效。字符串中的字符是否由于引用传递而被删除?我没有看到减量之类的东西,所以我感到非常困惑。另外,由于函数调用栈的lifo性质,字符串是否会反转?
void reverse(const char * const sPtr){
if('\0' == sPtr[0])
return;
else{
reverse(&sPtr[1]);
putchar(sPtr[0]);
}
}
答案 0 :(得分:2)
没有被删除。但是传递给函数的指针在以下表达式中发生了变化:
&sPtr[1]
...等同于
sPtr + 1
因此,每个递归调用将指针加1,从而导致递归调用遍历char
数组。
至于为什么这会导致字符串反转,堆栈的LIFO性质确实是原因。您的函数 first 递归调用自己,然后 then 使用putchar
输出当前字符。因此,这具有以相反顺序输出字符的效果。
答案 1 :(得分:2)
如果输入“ abc”,则调用堆栈将如下所示。
reverse("abc")
reverse("bc")
reverse("c")
print("c")
print("b")
print("a")
因此,每个反向调用都使用相同的字符串调用自己,但排除了第一个字符,然后在该字符串中打印第一个字符。
字符串中的字符是否由于引用传递而被删除?
C中没有通过引用进行的调用。指针有点模仿它,但是C中的所有内容都是按值传递的。此外,指针const char * const
的类型说明了两点。首先,不会重新分配指针指向其他任何地方,但是更重要的是,它还表示不会更改字符串。尝试将sPtr[0] = 'a'
行添加到某处,您会收到编译器错误。
答案 2 :(得分:1)
不,它不会被删除。
在每个递归调用中,您都希望前进到下一个字符,此操作在此处完成:
reverse(&sPtr[1]); // you pass a parameter the 1st character of where you point to now
答案 3 :(得分:1)
最后一个reverse(&sPtr[1])
之后将堆叠3次putchar调用。
reverse
的每次调用都将指针加1,因此,堆叠的调用将为-假设输入字符串由3个字符组成-
CURRENT FRAME -- *(ptr+3) is NULL
putchar(*(ptr+2))
putchar(*(ptr+1))
putchar(*(ptr+0))