2

従来の swap 関数では、2 つのポインターを渡すと、ポインターが指す値が入れ替わります。ただし、この単純な関数では

int leng (char *a)
{
    int n;
    for (n=0; *a!='\0'; a++)
        n++;
    return n;
}

関数が呼び出された後も、ポインタは配列の最後の要素ではなく最初の要素を指しています。何故ですか?スワップ機能との違いは?

4

4 に答える 4

6

ポインタはそれ自体がオブジェクトです。この場合、ポインターを参照ではなく値で渡すため、ポインター自体への変更は関数の外部に反映されません。関数内でポインターが指すオブジェクトを変更した場合、それらの変更は関数の外部で持続します。

試す:

int leng (char** a)
{
    int n;
    for (n=0; **a!='\0'; (*a)++)
        n++;
    return n;
}

leng(&pointer);
于 2013-03-10T22:33:21.037 に答える
2

ポインタを値で渡しています。ポインタ値は、関数呼び出し中にスタックにコピーされます。そのスタック変数をインクリメントしていますが、関数が戻るとスタック変数はなくなります。

于 2013-03-10T22:34:52.020 に答える
1

swapこれは実際には関数と同じです。このswap関数では、ポイントされている値を変更できますが、ポインター自体を変更することはできません。同様に、を指すleng文字列内の文字を変更できますが、それ自体への変更(別の配列要素を指すように変更)は、呼び出し元には表示されません。aa

これを変更したい場合は、次のように記述してください。

int leng (char **a)
{
    int n;
    for (n=0; **a!='\0'; *a++)
        n++;
    return n;
}

へのポインタ a渡します。

于 2013-03-10T22:33:35.360 に答える
1

通常のポインタだけでなく、ポインタからポインタへのポインタが必要になる場合があります。(ポインター自体は値によって渡されます。渡されたポインターのコピーの値を変更します)。

于 2013-03-10T22:33:49.290 に答える