1

メモリに大きな文字列があり、そのスライスを関数で提供したい状況があります (たとえば、30 から始まる 14 文字の実行を与えてください)。これを機能させるには、コンシューマーにバッファーにダブル ポインターを使用させる必要がありました。

void foo(char** bar)
{
    char* tmp = "nope";
    *bar = &tmp[1];
}

int main (int argc, char const *argv[])
{
    char* baz = "yep";
    foo(&baz);
    printf("%s", baz);
    return 0;
}

しかし、pread や strcpy などのさまざまなライブラリ関数を見ると、それらは 1 つのポインター レベルで文字列バッファーを受け入れます。

彼らはどのようにそれをしているのですか?同じように「反対側」の値を変更するには、ダブルポインターも必要なようです。

4

3 に答える 3

2

ポインタとポインティを区別する必要があります。次のように呼び出される単一レベルのポインターを取る関数を考えてみましょう。

char *p = ...;
f(p);

fのコピーを受け取りますp。このコピーは同じメモリを指すpため、メモリ ポイントfの値を変更できますが、メモリのどの部分が指すかを変更することはできません。契約では、ダブル ポインターを受け入れる関数は次のように呼び出されます。pp

char *p;
g(&p);

g( の値を与える)fを使用して、実行できるすべてのことを実行できます。さらに、それは変化する可能性があるため、別の記憶を指すこともあります。これはほとんどの関数で必要ありませんが、便利な場合があります。*the_parameterppp

于 2013-05-13T14:20:15.443 に答える