什么是双星(例如NSError **)?

所以,我看到这个:

error:(NSError **)error 

在苹果文件的。 为什么两颗星? 有什么意义?

“双星”是指向指针的指针。 所以NSError **是一个指向NSErrortypes的对象的指针。 它基本上允许你从函数返回一个错误对象。 你可以在你的函数中创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一样,那么**表示一个指向指针的指针。

Interesting Posts