54

だから、私はこれを見ました:

error:(NSError **)error

アップルドキュメントにあります。なぜ2つ星?重要性は何ですか?

4

5 に答える 5

69

「二重星」はポインターへのポインターです。型のオブジェクトへのポインターNSError **へのポインターも同様NSErrorです。基本的に、関数からエラー オブジェクトを返すことができます。関数内でオブジェクトへのポインターを作成しNSError(それを と呼びます*myError)、次のようにすることができます。

*error = myError;

そのエラーを呼び出し元に「返す」。


以下に投稿されたコメントへの返信として:

NSError *C では、関数パラメーターは値によって渡されるため、単純に an を使用することはできません。つまり、関数に渡されるときに値がコピーされます。説明のために、次の C コードのスニペットを考えてみましょう。

void f(int x)
{
    x = 4;
}

void g(void)
{
    int y = 10;
    f(y);
    printf("%d\n", y);    // Will output "10"
}

xinの再割り当ては、外部(たとえば in )f()の引数の値には影響しません。f()g()

同様に、ポインターが関数に渡されると、その値がコピーされ、再代入は関数の外部の値には影響しません。

void f(int *x)
{
    x = 10;
}

void g(void)
{
    int y = 10;
    int *z = &y;
    printf("%p\n", z);    // Will print the value of z, which is the address of y
    f(z);
    printf("%p\n", z);    // The value of z has not changed!
}

もちろん、 what の値zをかなり簡単に変更できることはわかっています。

void f(int *x)
{
    *x = 20;
}

void g(void)
{
    int y = 10;
    int *z = &y;
    printf("%d\n", y);    // Will print "10"
    f(z);
    printf("%d\n", y);    // Will print "20"
}

したがって、 an がNSError *指すものの値を変更するには、ポインターをポインターに渡す必要があるのも当然です。

于 2009-03-02T21:42:28.097 に答える
45

C ではすべてが値渡しです。何かの値を変更したい場合は、そのアドレスを渡します (メモリアドレスの値を渡します)。ポインターが指す場所を変更したい場合は、ポインターのアドレスを渡します。

簡単な説明については、こちらをご覧ください

于 2009-03-02T21:44:01.820 に答える
10

C では、二重星はポインターへのポインターです。これにはいくつかの理由があります。1 つ目は、ポインターがポインターの配列を指している可能性があることです。もう 1 つの理由は、関数にポインターを渡すことです。関数はポインターを変更します (他の言語の "out" パラメーターに似ています)。

于 2009-03-02T21:40:52.717 に答える
4

C のようなものであれば**、ポインターへのポインターを意味します。

于 2009-03-02T21:40:01.707 に答える