所以我在互联网上看到了这段代码,用于在 C 中使用递归反转字符串。
除了 reverse
的部分,我理解代码函数返回 str1
然后 str1
印在main
功能。 str1
不是通过引用传递的,而只是通过地址传递的。那么当它通过 main
打印时,它如何打印反转的字符串而不是原始字符串?功能?
void reverse(char str1[], int index, int size);
int main() {
char str1[20];
int size;
printf("Enter a string to reverse: ");
scanf("%s", str1);
size = strlen(str1);
reverse(str1, 0, size - 1);
printf("The string after reversing is: %s\n", str1);
return 0;
}
void reverse(char str1[], int index, int size) {
char temp;
temp = str1[index];
str1[index] = str1[size - index];
str1[size - index] = temp;
if (index == size / 2) {
return str1;
} else {
reverse(str1, index + 1, size);
}
}
最佳答案
对于初学者,您展示的功能是错误的。如果像这样将空字符串传递给函数
reverse(str1, 0, size - 1);
那么表达式 size - 1
将等于 -1
。结果,由于在这些语句中尝试访问数组以外的内存,该函数将具有未定义的行为
str1[index] = str1[size - index];
str1[size - index] = temp;
该函数有两个参数。字符串函数通常返回指向目标字符串的指针。所以如果函数 reverse
也返回指向字符串的指针会更好。
它可以定义得更简单。例如
char * reverse(char *s, size_t n)
{
if (!(n < 2))
{
char c = s[0];
s[0] = s[n - 1];
s[n - 1] = c;
reverse(s + 1, n - 2);
}
return s;
}
你可以这样调用它
printf("The string after reversing is: %s\n", reverse( str1, strlen( str1) ));
至于你质疑这个声明
void reverse(char str1[], int index, int size);
等价于下面的声明
void reverse(char *str1, int index, int size);
^^^^^^^^^^
当一个数组被传递给 tp 这样的函数时
reverse(str1, 0, size - 1);
然后数组指示符被转换为指向其第一个元素的指针。在函数内,数组不会从一个内存区域移动到另一个内存区域。它停留在同一个地址。仅更改数组的元素。所以在退出函数之后,数组的元素将被修改,但它们在内存中的地址将与调用函数之前在数组中的地址相同。事实上,数组元素通过引用传递给函数,即通过指向数组第一个元素的指针。
关于c - 另一个函数返回时主函数中的变量访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41015452/