当您将一个数组传递给一个函数时,该数组会衰变为一个指向其第一个元素的指针(除非您通过引用传递它,在这里不是这种情况)。在strArray
这是一个字符数组的情况下,这意味着您传递了第一个字母的地址。所以当main()
函数调用stringReverse(strArray);
时,它所做的是将指针传递给"Print this string backwards."
的'P'
。但请记住,在每个字符串的末尾会自动添加一个字符串终止符('\0'
),因此在这种情况下,还会有一个标记数组末尾的“不可见”字符。
该函数检查它收到的第一个字符是否为'\0'
,如果不是,则递归调用自身,但这次它不会传递完整字符串作为参数;相反,它传递位置1处的字符地址(请记住,数组索引从0开始,因此它实际上是第二个字符;在这种情况下,为'r'
)。这意味着传递的新字符串是"rint this string backwards."
。然后它是"int this string backwards."
,并且它每次都跳过第一个字母。当只有点'.'
(和通常情况下最后不可见的)时,下一个呼叫仅通过'\0'
字符,if
为真,并且该函数不做任何事情就返回。这是递归的结束:这次函数不会调用它自己。
现在,递归的关键是程序会记住每个函数被调用的状态,这样当函数完成时,它将从那里恢复。这意味着函数中的下一条指令是stringReverse(&strArray[ 1 ]);
之后的那条指令,即cout << strArray[ 0 ];
,它会打印字符串的第一个字符。 即字符串,即通过即时间的子字符串。在这种情况下,字符串是"."
(加上字符串终止符),所以第一个字符是点'.'
,并且它被打印。该函数返回,程序的执行从调用函数中恢复:字符串为"s."
的那个函数。在这种情况下,strArray[ 0 ]
对应于's'
,并将其打印。然后函数返回,前一个被恢复,并且为此字符串是"ds."
,因此打印'd'
。它一路回来。
这样,字符反向打印。这一直持续到结束:在'P'
被打印之后,该功能终止并且执行返回到main()
。
举个例子:带一些朋友,让他们组成一排。对他们每个人都给出相同的指示:当你收到一个球时,记住给予你的绳子,把第二个字母的绳子告诉你右边的那个人并给他一个球。如果被告知的字符串是空的,则不要执行任何操作,并将球放回到左侧的那个球。当有人拿回球时,他必须说出第一个字母(他没有发给其他人的那封信),然后把球送回左边的那个。所以它会是这样的:
第一个接收字符串“向后打印此字符串”,他说“向后打印此字符串”。到他右边的那个,然后把球给了他。 第二次听到“向后r this string。”“”“”so so so so so so so so so so so so so so so so so so so so so并将球传递给右边的球。它一直持续到最后:最后一个接球,但是这个绳子是空的,所以他只是把球送回了左边的那个。那时,在他面前的那个人说''。并将球传给左边的那个人,他会说's'并将球留下,等等,直到第一个人接到球并说'P'。
要以相反方式打印字符串:从第二个字符开始向后打印所有内容,然后在最后打印它们原始字符串的第一个字符。 –