0

我看过这段代码:

void reverse_string(char *str)
{
    /* skip null */
    if (str == 0)
    {
        return;
    }

    /* skip empty string */
    if (*str == 0)
    {
        return;
    }

    /* get range */
    char *start = str;
    char *end = start + strlen(str) - 1; /* -1 for \0 */
    char temp;

    /* reverse */
    while (end > start)
    {
        /* swap */
        temp = *start;
        *start = *end;
        *end = temp;

        /* move */
        ++start;
        --end;
    }
}

而且我不明白为什么函数中没有传递指向指针的指针。如果在函数内部制作了传递的指针的副本,那么如何反转它呢?变化是如何向外传播的?

4

5 回答 5

3

如果在函数内部制作了传递的指针的副本,那么如何反转它呢?变化是如何传播到外部的

它之所以有效,是因为您正在更改该指针指向的内存。所以在函数结束后,指针仍然指向它以前的位置,但是内容(字符的顺序)已经改变了。换句话说,没有必要改变地址str指向。

于 2013-02-10T22:57:56.330 回答
1

数组的内存内容char *被原地修改。

于 2013-02-10T22:58:12.180 回答
0

字符串被反转到位。也就是说,指向字符串的指针保持不变,但它指向的字符串是相反的。

于 2013-02-10T22:58:19.547 回答
0

看一下 while 循环,您会看到字符串在原地反转。

   while (end > start)
    {
        /* swap */
        temp = *start;
        *start = *end;
        *end = temp;

        /* move */
        ++start;
        --end;
    }
于 2013-02-10T22:59:04.033 回答
0

反转字符串不是对指针的操作。这是对指针指向的数据的操作。这就是指针本身可以按值传递给函数的原因,即在函数内部,它实际上是传递给函数的指针的副本——没关系,因为不需要修改指针,只需修改指向的数据。

于 2013-02-10T23:01:39.060 回答