Pregunta

Entonces, vi esto:

error:(NSError **)error

en los documentos de apple. ¿Por qué dos estrellas? ¿Cuál es el significado?

¿Fue útil?

Solución

A " estrella doble " es un puntero a un puntero. Entonces NSError ** es un puntero a un puntero a un objeto de tipo NSError . Básicamente le permite devolver un objeto de error de la función. Puede crear un puntero a un objeto NSError en su función (llámelo * myError ) y luego haga algo como esto:

*error = myError;

a " return " ese error a la persona que llama.


En respuesta a un comentario publicado a continuación:

No puede simplemente usar un NSError * porque en C, los parámetros de función se pasan por valor & # 8212; es decir, los valores se copian cuando se pasa a una función. Para ilustrar, considere este fragmento de código C:

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

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

La reasignación de x en f () no afecta el valor del argumento fuera de f () (en g ( ) , por ejemplo).

Del mismo modo, cuando se pasa un puntero a una función, su valor se copia y la reasignación no afectará el valor fuera de la función.

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

Por supuesto, sabemos que podemos cambiar el valor de lo que z señala con bastante facilidad:

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

Por lo tanto, es lógico que, para cambiar el valor de lo que apunta un NSError * , también tenemos que pasar un puntero al puntero.

Otros consejos

En C todo pasa por valor. Si desea cambiar el valor de algo, le pasa la dirección (que pasa el valor de la dirección de memoria). Si desea cambiar dónde apunta un puntero, pase las direcciones del puntero.

Consulte aquí para obtener una explicación simple .

En C, una estrella doble es un puntero a un puntero. Hay un par de razones para hacer esto. Primero es que el puntero podría estar en una matriz de punteros. Otra razón sería pasar un puntero a una función, donde la función modifica el puntero (similar a un parámetro "fuera" en otros idiomas).

La notación de doble estrella (**) no es específica para inicializar una variable en una clase. Es simplemente una doble referencia indirecta a un objeto.

  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

La notación de doble puntero se usa cuando la persona que llama tiene la intención de que uno de sus propios punteros necesite ser modificado por una llamada de función, por lo que la dirección del puntero, en lugar de la dirección del objeto, se pasa a la función.

Un ejemplo podría ser el uso de una lista vinculada. La persona que llama mantiene un puntero al primer nodo. La persona que llama invoca funciones para buscar, agregar y eliminar. Si esas operaciones implican agregar o eliminar el primer nodo, entonces el puntero de la persona que llama tiene que cambiar, no el puntero .next en ninguno de los nodos, y necesita la dirección del puntero para hacerlo.

Si se parece a C, entonces ** significa un puntero a un puntero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top