【发布时间】:2014-01-08 16:52:48
【问题描述】:
我偶然在 SO 上偶然发现了关于双星 (**) 与 NSError 的用法的帖子。决定更深入地挖掘它,这导致我重新访问C。
我已经在NSError阅读了很多帖子(此处不重复),我理解他们为什么这样做。
所以,我决定在 IDE (Xcode) 中编写一个小 sn-p 来亲自查看它的实际效果。
int a = 10;
int b = 20;
int *c = &a;
int *d = &b;
int **e = &d;
NSLog(@"Before: a is: %d b is: %d", a, b);
[self testSingleStar:c];
[self testDoubleStar:e];
NSLog(@"After: a is: %d b is: %d", a, b);
方法:
- (void)testDoubleStar:(int**)x
{
int anotherValue1 = 22;
**x = anotherValue1;
}
- (void)testSingleStar:(int*)x
{
int anotherValue2 = 33;
*x = anotherValue2;
}
输出:
之前:a 为:10 b 为:20
之后:a 为:33 b 为:22
a(通过单指针)和b(通过双指针)的值都发生了变化。
那么,如果我们可以使用仅使用单个指针来更改(a)的值,为什么我们需要使用指向@的指针987654330@ 以便我们可以在方法调用中修改NSError 对象,其中NSError 对象在其参数中传递(&error)?
另外:
关于上述,在C 中向参数传递一些东西实际上是向参数传递一个副本(即使在单个指针的情况下也只会传递它的一个副本),因此在内部进行的任何更改该方法的范围不会影响传递给它的原始值(这就是他们使用双星的原因)。
但上面只使用了一个指针的示例似乎与此相矛盾,因为值(即由单个指针指向的a - c)确实发生了变化?
【问题讨论】:
-
使用 Objective-C 对象实例而不是原语重新评估您的测试。
-
@trojanfoe 当然可以。但是即使在
C的情况下,也需要一个双指针来修改方法范围内的原始值,但是从上面的示例中,一个指针就足够了? -
@trojanfoe 试过了。你能告诉我为什么即使使用单指针它也只适用于原语?谢谢。
标签: objective-c c pointers nserror double-pointer