¿Qué es la estrella doble (por ejemplo, NSError **)?

¿Qué es la estrella doble (por ejemplo, NSError **)?


Entonces, vi esto:


error:(NSError **)error

en el documento de Apple. ¿Por qué dos estrellas? ¿Cuál es el significado?


Respuestas:


Una "doble estrella" es un puntero a un puntero. Así que 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 NSError objeto en su función (llámelo *myError ), y luego haz algo como esto:


*error = myError;

para "devolver" ese error a la persona que llama.



En respuesta a un comentario publicado a continuación:


No puedes simplemente usar un NSError * porque en C, los parámetros de función se pasan por valor —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 what z apunta a 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"
}

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