另一个函数返回时,main函数中的变量访问?

时间:2016-12-07 10:49:03

标签: c

所以我在互联网上看到了这个代码,用于在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);
    }
}

3 个答案:

答案 0 :(得分:1)

对于初学者来说,你所展示的功能是错误的。如果将空字符串传递给函数,就像这样

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);

然后将数组指示符转换为指向其第一个元素的指针。在函数内,数组不会从一个存储区移动到另一个存储区。它停留在同一个地址。只更改了数组的元素。因此,在退出函数之后,将修改数组的元素,但在调用函数之前,它们将在内存中具有与数组中相同的地址。实际上,数组元素通过引用传递给函数,该引用是指向数组的第一个元素的指针。

答案 1 :(得分:1)

该函数不返回任何内容,它接收数组作为指向其第一个元素的指针(数组衰减成指向其第一个元素的指针)并且它在适当的位置执行转置。请注意,声明void reverse(char str1[], int index, int size)等同于void reverse(char *str1, int index, int size)

代码有多个问题:

  • 它对偶数长度的字符串不起作用。它甚至会在空字符串上调用未定义的行为。

  • 它使用递归没有正当理由。一个简单的循环方法会更简单,并且具有更少的错误。

  • 它有一个return 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;
}

答案 2 :(得分:1)

变量的引用是它的地址,或者更准确地说是保存地址的变量。

当您通过引用传递一个对象/变量时,您可以通过它传递它的地址,在C中,您可以通过在c#中传递变量的指针来实现它,例如,您需要声明&#34; ref&#34 ;将参数传递给函数时。