Domanda

Quindi, ho visto questo:

error:(NSError **)error

nei documenti di Apple. Perché due stelle? Qual è il significato?

È stato utile?

Soluzione

Una "doppia stella" è un puntatore a un puntatore. Quindi NSError ** è un puntatore a un puntatore a un oggetto di tipo NSError . Fondamentalmente ti consente di restituire un oggetto errore dalla funzione. Puoi creare un puntatore a un oggetto NSError nella tua funzione (chiamalo * myError ) e quindi fare qualcosa del genere:

*error = myError;

a " return " quell'errore al chiamante.


In risposta a un commento pubblicato di seguito:

Non puoi semplicemente usare un NSError * perché in C, i parametri della funzione vengono passati per valore & # 8212; ovvero, i valori vengono copiati quando passato a una funzione. Per illustrare, considera questo frammento di codice C:

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

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

La riassegnazione di x in f () non influisce sul valore dell'argomento al di fuori di f () (in g ( ) , ad esempio).

Allo stesso modo, quando un puntatore viene passato in una funzione, il suo valore viene copiato e la riassegnazione non influirà sul valore esterno alla funzione.

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

Naturalmente, sappiamo che possiamo cambiare il valore di ciò che z indica abbastanza facilmente:

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

Quindi è ovvio che, per cambiare il valore di ciò a cui punta un NSError * , dobbiamo anche passare un puntatore al puntatore.

Altri suggerimenti

In C tutto è passato per valore. Se vuoi cambiare il valore di qualcosa, ne passi l'indirizzo (che passa il valore dell'indirizzo di memoria). Se vuoi cambiare il punto in cui punta un puntatore, passi gli indirizzi del puntatore.

Dai un'occhiata qui per una semplice spiegazione .

In C, una doppia stella è un puntatore a un puntatore. Ci sono un paio di ragioni per farlo. Il primo è che il puntatore potrebbe essere su una matrice di puntatori. Un altro motivo sarebbe quello di passare un puntatore a una funzione, in cui la funzione modifica il puntatore (simile a un parametro "out" in altre lingue).

La notazione a doppia stella (**) non è specifica per l'inizializzazione di una variabile in una classe. È semplicemente un doppio riferimento indiretto a un oggetto.

  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 notazione con doppio puntatore viene utilizzata quando il chiamante intende che uno dei propri puntatori deve essere modificato da una chiamata di funzione, quindi l'indirizzo del puntatore, anziché l'indirizzo dell'oggetto, viene passato alla funzione.

Un esempio potrebbe essere l'uso di un elenco collegato. Il chiamante mantiene un puntatore al primo nodo. Il chiamante richiama le funzioni per cercare, aggiungere e rimuovere. Se tali operazioni comportano l'aggiunta o l'eliminazione del primo nodo, il puntatore del chiamante deve cambiare, non il puntatore .next in uno dei nodi, e per farlo è necessario l'indirizzo del puntatore.

Se assomiglia a C, ** indica un puntatore a un puntatore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top