Вопрос

Итак, я увидел это:

error:(NSError **)error

в Apple Doc.Почему две звезды?В чем значение?

Это было полезно?

Решение

«Двойная звезда» — это указатель на указатель.Так NSError ** является указателем на указатель на объект типа NSError.По сути, это позволяет вам вернуть объект ошибки из функции.Вы можете создать указатель на NSError объект в вашей функции (назовите его *myError), а затем сделайте что-то вроде этого:

*error = myError;

чтобы «вернуть» эту ошибку вызывающему абоненту.


В ответ на комментарий, размещенный ниже:

Вы не можете просто использовать NSError * потому что в C параметры функции передаются по стоимости- то есть значения скопирован при передаче в функцию.Для иллюстрации рассмотрим этот фрагмент кода C:

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

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

Переназначение x в f() не влияет на значение аргумента за пределами f()g(), например).

Аналогично, когда указатель передается в функцию, его значение копируется, и повторное присвоение не повлияет на значение вне функции.

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

Конечно, мы знаем, что можем изменить ценность того, что z указывает на довольно легко:

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

Поэтому само собой разумеется, что для изменения ценности того, что NSError * указывает на, нам также нужно передать указатель на указатель.

Другие советы

В C все передается по значению.Если вы хотите изменить значение чего-либо, вы передаете его адрес (который передает значение адреса памяти).Если вы хотите изменить место, куда указывает указатель, вы передаете адрес указателя.

Посмотрите здесь для простого объяснения.

В языке C двойная звездочка — это указатель на указатель.Есть несколько причин сделать это.Во-первых, указатель может относиться к массиву указателей.Другой причиной может быть передача указателя на функцию, при этом функция изменяет указатель (аналогично параметру «out» в других языках).

Обозначение двойной звезды (**) не предназначено для инициализации переменной в классе.Это просто двойная косвенная ссылка на объект.

  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

Нотация двойного указателя используется там, где вызывающая сторона предполагает, что один из его собственных указателей должен быть изменен вызовом функции, поэтому функции передается адрес указателя вместо адреса объекта.

Примером может быть использование связанного списка.Вызывающий объект сохраняет указатель на первый узел.Вызывающая сторона вызывает функции для поиска, добавления и удаления.Если эти операции включают добавление или удаление первого узла, тогда должен измениться указатель вызывающего объекта, а не указатель .next в любом из узлов, и для этого вам понадобится адрес указателя.

Если это что-то вроде C, тогда ** означает указатель на указатель.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top