C 当另一个函数返回时,主函数中的变量访问?
所以我在互联网上看到了这段代码,它使用C中的递归来反转字符串 除了C 当另一个函数返回时,主函数中的变量访问?,c,C,所以我在互联网上看到了这段代码,它使用C中的递归来反转字符串 除了reverse函数返回str1然后在main函数中打印str1的部分之外,我理解代码str1不是通过引用传递的,而是通过地址传递的。那么,当它通过main函数打印时,它为什么会打印反向字符串而不是原始字符串呢 void reverse(char str1[], int index, int size); int main() { char str1[20]; int size; printf("Ente
reverse
函数返回str1
然后在main
函数中打印str1
的部分之外,我理解代码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;
}
至于你对这份声明的质疑
void reverse(char str1[], int index, int size);
void reverse(char *str1, int index, int size);
^^^^^^^^^^
等同于以下声明
void reverse(char str1[], int index, int size);
void reverse(char *str1, int index, int size);
^^^^^^^^^^
当数组传递到tp时,函数如下所示
reverse(str1, 0, size - 1);
然后将数组指示符转换为指向其第一个元素的指针。在函数中,阵列不会从一个内存区域移动到另一个内存区域。它保持在同一个地址。仅更改数组的元素。因此,在退出函数后,数组的元素将被修改,但它们在内存中的地址与调用函数之前数组中的地址相同。事实上,数组元素通过指向数组第一个元素的指针的引用传递给函数。函数不返回任何内容,它接收数组作为指向其第一个元素的指针(数组衰减为指向其第一个元素的指针),并在适当的位置执行转置。注意声明
void reverse(char str1[],int index,int size)
相当于void reverse(char*str1,int index,int size)
该代码存在多个问题:
- 它不适用于长度为偶数的字符串。它甚至对空字符串调用未定义的行为
- 它使用递归是没有正当理由的。一个简单的循环方法会更简单,并且有更少的bug
- 它有一个
返回str1代码>语句,即使它被定义为
void
函数不返回任何内容,它接收数组作为指向其第一个元素的指针,并在适当的位置执行转置 这里有一个更简单的选择:
#include <stdio.h>
char *reverse(char *str) {
for (size_t i = 0, length = strlen(str); i < length / 2; i++) {
char temp;
temp = str[i];
str1[i] = str1[length - i - 1];
str1[length - i - 1] = temp;
}
return str;
}
int main(void) {
char buf[100];
printf("Enter a string to reverse: ");
if (scanf("%s", buf) == 1) {
printf("The string after reversing is: %s\n", reverse(buf));
}
return 0;
}
#包括
字符*反向(字符*str){
对于(大小i=0,长度=strlen(str);i
变量的引用是它的地址,或者更准确地说是保存地址的变量
当你通过ref传递一个对象/变量时,你会意外地传递它的地址,在C语言中,你通过传递变量的指针来传递它,而在C语言中,你需要声明“ref”,例如,当你把一个参数传递给一个函数时