54

所以,我看到了这个:

error:(NSError **)error

在苹果文档中。为什么是两星?有什么意义?

4

5 回答 5

69

“双星”是指向指针的指针。NSError **指向指向类型对象的指针也是如此NSError。它基本上允许您从函数返回错误对象。您可以在函数中创建指向NSError对象的指针(调用它*myError),然后执行以下操作:

*error = myError;

将该错误“返回”给调用者。


回复下面发布的评论:

您不能简单地使用 an,NSError *因为在 C 中,函数参数是按值传递的——也就是说,值在传递给函数时会被复制。为了说明,请考虑以下 C 代码片段:

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

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

xin的重新分配f()不会影响参数在外部的值f()g()例如 in )。

同样,将指针传递给函数时,会复制其值,并且重新分配不会影响函数外部的值。

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

所以按理说,要改变 an 所NSError *指向的值,我们还必须将指针传递给该指针。

于 2009-03-02T21:42:28.097 回答
45

在 C 中,一切都是按值传递的。如果你想改变一些东西的值,你传递它的地址(它传递内存地址的值)。如果要更改指针指向的位置,请传递指针的地址。

看看这里的简单解释

于 2009-03-02T21:44:01.820 回答
10

在 C 中,双星是指向指针的指针。这样做有几个原因。首先是指针可能指向一个指针数组。另一个原因是将指针传递给函数,函数修改指针(类似于其他语言中的“out”参数)。

于 2009-03-02T21:40:52.717 回答
7

双星 ( **) 符号并不特定于初始化类中的变量。它只是对对象的双重间接引用。

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 指针,并且您需要指针的地址来执行此操作。

于 2013-04-24T04:58:54.880 回答
4

如果它与 C 类似,则**表示指向指针的指针。

于 2009-03-02T21:40:01.707 回答