【问题标题】:Why not use pointer to pointer when reversing a string?为什么在反转字符串时不使用指针指针?
【发布时间】:2013-01-26 01:11:31
【问题描述】:

我看过这段代码:

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

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

【问题讨论】:

  • 想想指针指向什么。这个函数和调用者的那个地方是一样的。

标签: c function pointers scope


【解决方案1】:

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

之所以有效,是因为您正在在该指针指向的内存中进行更改。所以在函数结束后,指针仍然指向它以前的位置,但是内容(字符的顺序)已经改变了。也就是说,str指向的地址不用改。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      字符串正在原地反转。也就是说,指向字符串的指针保持不变,但它指向的字符串是相反的。

      【讨论】:

        【解决方案4】:

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

           while (end > start)
            {
                /* swap */
                temp = *start;
                *start = *end;
                *end = temp;
        
                /* move */
                ++start;
                --end;
            }
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2012-05-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多