什么是双星(例如NSError **)?
所以,我看到这个:
error:(NSError **)error
在苹果文件的。 为什么两颗星? 有什么意义?
“双星”是指向指针的指针。 所以NSError **
是一个指向NSError
types的对象的指针。 它基本上允许你从函数返回一个错误对象。 你可以在你的函数中创build一个指向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" }
例如, f()
中x
的重新分配不会影响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”参数)。
双星(**)符号不是特定于初始化类中的variables。 它只是一个对象的双重间接引用。
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
双指针符号用于调用者希望自己的指针需要被函数调用修改的地方,所以指针的地址而不是对象的地址被传递给函数。
一个例子可能是使用链表。 调用者维护一个指向第一个节点的指针。 调用者调用函数来search,添加和删除。 如果这些操作涉及添加或删除第一个节点,则调用者的指针必须改变,而不是任何节点中的.next指针,并且您需要指针的地址来完成此操作。
如果它像C一样,那么**
表示一个指向指针的指针。