Что такое двойная звезда (например, NSError **)?

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

error:(NSError **)error 

в яблочном доке. Почему две звезды? В чем смысл?

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

 *error = myError; 

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


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

Вы не можете просто использовать NSError * потому что в C параметры функции передаются по значению – то есть, значения копируются при передаче функции. Для иллюстрации рассмотрим этот fragment кода 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» на других языках).

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

  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 

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

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

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

  • Проходит ли указатель указателя, передается по значению в C ++?
  • Как сравнить две функции для равенства указателей в последней неделе?
  • Разница между char * и const char *?
  • Функция не меняет пройденный указатель C ++
  • Надежное определение количества элементов в массиве
  • Когда следует использовать static_cast, dynamic_cast, const_cast и reinterpret_cast?
  • Объявление указателей; звездочку слева или справа от пространства между типом и именем?
  • Swift 2 - UnsafeMutablePointer для объекта
  • Как использовать массивы на C ++?
  • Что возвращает sizeof (& array)?
  • Что мне нужно сделать, прежде чем удалять элементы в векторе указателей на динамически выделенные объекты?
  • Давайте будем гением компьютера.