2009-03-02 9 views

Respuesta

64

Una "estrella doble" es un puntero a un puntero. Por lo tanto, 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ámese *myError), y luego hacer algo como esto:

*error = myError; 

de "retorno" que el error a la persona que llama.


En respuesta a un comentario publicado a continuación:

Simplemente no se puede utilizar un NSError * porque en C, los parámetros de una función se pasan por valor , es decir, los valores son copiadas cuando pasó 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, se copia su valor 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 z puntos a 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" 
} 

Así que es lógico pensar que, para cambiar el valor de lo que un NSError * puntos de , también tenemos que pasar un puntero al puntero.

+0

hola, estoy un poco tarde aquí. Me gustaría preguntar: ¿por qué debemos pasar un puntero a un puntero a NSError o, en general, para devolver un objeto? Por ejemplo, de lo anterior, si solo pasamos un puntero a un objeto, sería suficiente: error = myError? (Habla: el error es un puntero a mi nuevo objeto de error myError)? Espero que puedas explicar mejor la justificación de usar un doble puntero. Muchas gracias de antemano. – Unheilig

+0

@Unheilig: Actualicé mi respuesta con una respuesta a su pregunta. – mipadi

+0

Gracias por la redacción, pero usted quiso decir 'int f (int ** x)' en su último ejemplo, ¿verdad? Y si es así, debería esto - 'printf ("% d \ n ", y);' - también cambiarse a: 'printf ("% d \ n ", &y);' (añadido '&' a 'y') en el método 'void' en lugar de' y' también? – Unheilig

4

Si es algo así como C, entonces ** significa un puntero a un puntero.

+9

Objective-C es un superconjunto estricto de C. Nada de C es diferente. –

10

En C, una estrella doble es un puntero a un puntero. Hay un par de razones para hacer esto. Primero, el puntero podría ser 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 de "salida" en otros idiomas).

41

En C todo es pasar por valor. Si desea cambiar el valor de algo, pase la dirección del mismo (que pasa el valor de la dirección de la memoria). Si desea cambiar la posición de un puntero, pase las direcciones del puntero.

Take a look here for a simple explanation.

+0

Buena explicación .. – Tirth

+1

" todo está pasado por valor "--esta oración ordenada lo dice todo. ¡Gracias! –

+0

Respuesta excelente y clara. –

6

La notación de estrella doble (**) 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 

notación doble puntero se utiliza cuando la persona que llama tiene la intención de que uno de sus propios punteros deben ser modificados por una llamada a la 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 .nuevo puntero en ninguno de los nodos, y necesita la dirección del puntero para hacerlo.

+1

hay algunos problemas en su código –

+2

"* simplemente * una referencia indirecta doble". lol – Eric

Cuestiones relacionadas