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 に答える