O que é estrela dupla (por exemplo. NSError **)?
-
03-07-2019 - |
Pergunta
Então, eu vi isso:
error:(NSError **)error
na maçã doc. Por duas estrelas? Qual é o significado?
Solução
A "estrela dupla" é um ponteiro para um ponteiro. Então NSError **
é um ponteiro para um ponteiro para um objeto do tipo NSError
. Ele basicamente permite que você retorne um objeto de erro da função. Você pode criar um ponteiro para um objeto NSError
em sua função (chamemos-lhe *myError
), e em seguida, fazer algo como isto:
*error = myError;
para "retorno" que o erro para o chamador.
Em resposta a um comentário postado abaixo:
Você não pode simplesmente usar um NSError *
porque em C, os parâmetros de função são passados ?? por valor , ou seja, os valores são Copiado quando passado para uma função. Para ilustrar, considere esse trecho 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"
}
A reatribuição de x
em f()
não afeta fora o valor do argumento de f()
(em g()
, por exemplo).
Do mesmo modo, quando um ponteiro é passado para uma função, o seu valor é copiado, e re-atribuição não vai afectar o valor do lado de fora da função.
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!
}
É claro, sabemos que podemos mudar o valor do que pontos z
para com bastante facilidade:
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"
}
Assim, é lógico que, para alterar o valor do que um NSError *
aponta, também temos que passar um ponteiro para o ponteiro.
Outras dicas
Em C tudo é passar por valor. Se você quiser alterar o valor de algo que você passar o endereço dela (que passa o valor do endereço de memória). Se você quiser alterar o local onde o ponteiro aponta você passar as as addres do ponteiro.
Em C, uma estrela dupla é um ponteiro para um ponteiro. Há um par de razões para fazer isso. Primeiro é que o ponteiro poderia ser a de uma matriz de ponteiros. Outra razão seria a de passar um ponteiro para uma função, onde a função modifica o ponteiro (semelhante a um "fora" parâmetro em outros idiomas).
A notação estrela dupla (**) não é específico para inicializar uma variável em uma classe. É simplesmente uma referência indireta dupla a um 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
notação de ponteiro duplo é usado onde o chamador tem a intenção de que um de seus próprios ponteiros precisam ser modificados por uma chamada de função, então o endereço do ponteiro, em vez do endereço do objeto, é passado para a função.
Um exemplo pode ser o uso de uma lista ligada. O chamador mantém um ponteiro para o primeiro nó. As funções Invoca chamador pesquisar, adicionar e remover. Se essas operações envolvem adicionando ou excluindo o primeiro nó, em seguida, ponteiro do autor da chamada tem de mudar, não o ponteiro .next em qualquer um dos nós, e você precisa o endereço do ponteiro para fazer isso.
Se for qualquer coisa como C, em seguida, **
significa um ponteiro para um ponteiro.