54 votes

Qu'est-ce qu'une étoile double ?

Alors, j'ai vu ça :

error:(NSError **)error

dans les documents de la pomme. Pourquoi deux étoiles ? Quelle est la signification ?

70voto

mipadi Points 135410

Une "étoile double" est un pointeur vers un pointeur. Donc NSError ** est un pointeur sur un objet de type NSError . Il vous permet essentiellement de renvoyer un objet d'erreur à partir de la fonction. Vous pouvez créer un pointeur vers un objet NSError dans votre fonction (appelez-la *myError ), et ensuite faire quelque chose comme ça :

*error = myError;

pour "renvoyer" cette erreur à l'appelant.


En réponse à un commentaire posté ci-dessous :

Vous ne pouvez pas simplement utiliser un NSError * car en C, les paramètres des fonctions sont passés par valeur c'est-à-dire que les valeurs sont copié lorsqu'il est transmis à une fonction. Pour illustrer, considérez cet extrait de code C :

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

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

La réaffectation de x sur f() n'affecte pas la valeur de l'argument en dehors de l'option f() (en g() par exemple).

De même, lorsqu'un pointeur est passé dans une fonction, sa valeur est copiée, et la réaffectation n'affectera pas la valeur en dehors de la fonction.

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

Bien sûr, nous savons que nous pouvons changer la valeur de ce que z assez facilement :

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

Donc, il va de soi que, pour changer la valeur de ce qu'un NSError * pointe, nous devons également passer un pointeur sur le pointeur.

45voto

TofuBeer Points 32441

En C, tout est transmis par valeur. Si vous voulez changer la valeur de quelque chose, vous passez son adresse (qui passe la valeur de l'adresse mémoire). Si vous voulez changer l'endroit où pointe un pointeur, vous passez l'adresse du pointeur.

Jetez un coup d'œil ici pour une explication simple .

10voto

geofftnz Points 5844

En C, une étoile double est un pointeur vers un pointeur. Il y a plusieurs raisons de procéder ainsi. La première est que le pointeur peut être un tableau de pointeurs. Une autre raison serait de passer un pointeur à une fonction, où la fonction modifie le pointeur (similaire à un paramètre "out" dans d'autres langages).

7voto

user2313968 Points 31

La notation en double étoile (**) n'est pas spécifique à l'initialisation d'une variable dans une classe. Il s'agit simplement d'une double référence indirecte à un objet.

  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 notation du double pointeur est utilisée lorsque l'appelant souhaite que l'un de ses propres pointeurs soit modifié par un appel de fonction, de sorte que l'adresse du pointeur, au lieu de l'adresse de l'objet, est transmise à la fonction.

Un exemple pourrait être l'utilisation d'une liste liée. L'appelant maintient un pointeur sur le premier nœud. L'appelant invoque des fonctions de recherche, d'ajout et de suppression. Si ces opérations impliquent l'ajout ou la suppression du premier nœud, c'est le pointeur de l'appelant qui doit changer, et non le pointeur suivant dans l'un des nœuds, et vous avez besoin de l'adresse du pointeur pour le faire.

4voto

Andrew Hare Points 159332

Si c'est comme C, alors ``** signifie un pointeur vers un pointeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X