Frage

Also, ich sah so aus:

error:(NSError **)error

in dem Apfel doc. Warum zwei Sterne? Was ist die Bedeutung?

War es hilfreich?

Lösung

Ein „Doppelstern“ ist ein Zeiger auf einen Zeiger. So NSError ** ist ein Zeiger auf einen Zeiger auf ein Objekt vom Typ NSError. Es ermöglicht grundsätzlich einen Fehler Objekt aus der Funktion zurück. Sie können in Ihrer Funktion einen Zeiger auf ein NSError Objekt erstellen (nennen wir es *myError), und dann so etwas tun:

*error = myError;

auf "Rückkehr", dass Fehler an den Aufrufer.


In Antwort auf einen Kommentar unten geschrieben:

Sie können nicht einfach eine NSError * verwenden, da in C, Funktionsparameter übergeben werden nach Wert -Das ist, sind die Werte kopiert , wenn sie eine Funktion übergeben. Zur Veranschaulichung betrachten diese Schnipsel von C-Code:

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

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

Die Neuzuordnung von x in f() hat keinen Einfluss auf den Wert des Argument außerhalb von f() (in g(), zum Beispiel).

Auch wenn ein Zeiger in eine Funktion übergeben wird, wird der Wert kopiert, und die Neuzuweisung nicht den Wert außerhalb der Funktion beeinflussen.

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

Natürlich wissen wir, dass wir den Wert dessen, was z Punkte ändern kann ziemlich leicht:

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

So ist es liegt nahe, dass die Vernunft, den Wert zu ändern, was ein NSError * Punkt, müssen wir auch einen Zeiger auf den Zeiger übergeben.

Andere Tipps

In C ist alles Pass von Wert. Wenn Sie den Wert von etwas ändern wollen übergeben Sie die Adresse davon (die den Wert der Speicheradresse passiert). Wenn Sie ändern mögen, wo ein Zeiger Sie das addres des Zeigers übergeben.

Werfen Sie einen Blick hier für eine einfache Erklärung .

In C, ein Doppelstern ist ein Zeiger auf einen Zeiger. Es gibt ein paar Gründe, dies zu tun. Zuerst ist, dass der Zeiger auf ein Feld von Zeigern sein könnte. Ein weiterer Grund wäre, einen Zeiger auf eine Funktion zu übergeben, in dem die Funktion die Zeiger (ähnlich ein „out“ Parameter in anderen Sprachen) modifiziert.

Der Doppelstern (**) Notation ist nicht spezifisch eine Variable in einer Klasse zu initialisieren. Es ist einfach eine Doppel indirekter Verweis auf ein Objekt.

  float myFloat; // an object
    float *myFloatPtr; // a pointer to an object
    float **myFloatPtrPtr; // a pointer to a pointer to an object

    myFloat = 123.456; // initialize an object
    myFloatPtr = &myFloat; // initialize a pointer to an object
    myFloatPtrPtr = myFloatPtr; // initialize a pointer to a pointer to an object

    myFloat; // refer to an object
    *myFloatPtr; // refer to an object through a pointer
    **myFloatPtrPtr; // refer to an object through a pointer to a pointer
    *myFloatPtrPtr; // refer to the value of the pointer to the object

Doppelzeigernotation verwendet wird, bei dem der Anrufer beabsichtigt, dass eine seiner eigenen Zeiger müssen durch einen Funktionsaufruf geändert werden, so dass die Adresse des Zeigers, anstelle der Adresse des Objekts, an die Funktion übergeben wird.

Ein Beispiel könnte die Verwendung einer verknüpften Liste sein. Der Anrufer unterhält einen Zeiger auf den ersten Knoten. Der Anrufer ruft Funktionen zu suchen, hinzufügen und entfernen. Wenn diese Vorgänge beinhalten das Hinzufügen oder den ersten Knoten zu löschen, dann Zeiger des Anrufers muss sich ändern, nicht die .next Zeiger in einem der Knoten, und Sie müssen die Adresse des Zeigers, das zu tun.

Wenn es so etwas wie C dann ** bedeutet einen Zeiger auf einen Zeiger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top