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

所以我在互联网上看到了这段代码,它使用C中的递归来反转字符串

除了
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”,例如,当你把一个参数传递给一个函数时