Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么是双星(如N错误**)?_C_Objective C_Cocoa_Pointers_Multiple Indirection - Fatal编程技术网

C 什么是双星(如N错误**)?

C 什么是双星(如N错误**)?,c,objective-c,cocoa,pointers,multiple-indirection,C,Objective C,Cocoa,Pointers,Multiple Indirection,所以我看到这个, error:(NSError **)error 在苹果医生那里。为什么是两颗星?意义是什么?如果它与C类似,那么***表示指向指针的指针。在C中,双星是指向指针的指针。这样做有几个原因。首先,指针可能指向指针数组。另一个原因是传递一个指向函数的指针,其中函数修改指针(类似于其他语言中的“out”参数)。双星是指向指针的指针。因此,NSError**是指向类型为NSError的对象的指针。它基本上允许您从函数返回错误对象。您可以在函数中创建指向NSError对象的指针(称之为*

所以我看到这个,

error:(NSError **)error

在苹果医生那里。为什么是两颗星?意义是什么?

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

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

双星是指向指针的指针。因此,
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"
}
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中,一切都是按值传递的。如果你想改变某物的值,你可以传递它的地址(它传递内存地址的值)。如果要更改指针指向的位置,请传递指针的地址

.

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

  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
当调用方希望通过函数调用修改自己的一个指针时,使用双指针表示法,因此指针的地址而不是对象的地址被传递给函数

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

例如,可以使用链表。调用者维护指向第一个节点的指针。调用方调用函数来搜索、添加和删除。如果这些操作涉及添加或删除第一个节点,则调用者的指针必须更改,而不是任何节点中的.next指针,并且您需要指针的地址来执行此操作。

Objective-C是C的严格超集。C与C没有任何区别。“一切都是按值传递的”——这句简洁的句子告诉了一切。非常感谢。嗨,我来晚了一点。想问:为了返回一个对象,为什么我们必须传递一个指向NSError的指针或一般的指针?例如,从上面可以看出,如果我们只传递一个指向对象的指针,这就足够了:error=myError?(说明:error是指向我的新错误对象myError的指针)?希望您能进一步解释使用双指针的理由。非常感谢。@Unheilig:我更新了我的答案,回答了你的问题。谢谢你的评论,但你在上一个例子中的意思是
intf(int**x)
,对吗?如果是这样的话,这个-
printf(“%d\n”,y)-也可以更改为:
printf(“%d\n”,&y)(添加了
&
y
)在
void
方法中,而不是
y
?此外,我认为第二个示例中的代码中存在一个问题,类型不兼容,即在方法
void f(int*)
中,当您执行
x=10
(需要取消引用
*
)。谢谢。@Unheilig:示例是正确的,尽管可能有点混乱,但我正在演示您需要一个指向基本数据类型的指针才能更改值。对于
int
,这是
int*
;按照相同的逻辑,如果基本数据类型为
NSError*
,则为
NSError**