Dav*_*her 7 c pointers objective-c
我来自Objective-C背景,并且正在尝试扩展我在C中的知识.然而,有一件事让我感到困惑,那就是C和Obj-C中指针之间的区别.正如您在下面的示例中所看到的,两种语言之间的行为似乎有点不同,我想知道您是否可以帮助解释原因?
C代码工作正常:
void myFunction()
{
    int x, *pointerX; 
    pointerX = &x;
    *pointerX = 5;
    // Prints: "x is 5"
    printf("x is: %i", x);
}
Obj-C代码失败:
- (void)myMethod
{
    NSString *string = @"Caramel coffee", *stringPointer;
    stringPointer = &string;                    // Warning:   Assignemnt from incompatible pointer type
    *stringPointer = @"Chocolate milkshake";    // Exception: Incompatible types in assignment
    NSLog(@"string is: %@", string);
}
问:   为什么我不能将stringPointer分配给string(stringPointer = &string;)的内存地址,为什么我能够*pointerX = 5;在C下执行,但是我无法*stringPointer = @"Chocolate milkshake";在Objective-C下执行?
我意识到Obj-C处理对象而C没有,但我似乎无法弄清楚为什么它在Obj-C中不起作用的幕后细节.任何帮助是极大的赞赏.谢谢!:)
caf*_*caf 19
在你的第一个例子,x并pointerX有不同的类型((int)和(int *)分别).在第二个例子中,string并stringPointer有相同类型(NSString *).尝试改为:
NSString *string = @"Caramel coffee", **stringPointer;
E.M*_*.M. 10
你NSString *string自己就是一个指针.因此,为了指向它,您需要声明stringPointer为指针的指针.也就是说,声明stringPointer如下:
NSString **stringPointer;
一切都应该有效.请注意,相同的指针语义适用于C和Objective-C.
问题是,当你创建一个对象时,你实际上总是通过分配给它的指针来操纵它,因此(NSString*).
尝试在C中做同样的事情(使用字符串),也许它变得更清晰:
void myFunction()
{
    char *string = "this is a C string!";
    char **ptr=&string;
    // Prints: "this is a c string"
    printf("ptr points to %s: \n",  *ptr);
}
正如您所看到的,指针的工作方式与在objective-c中的工作方式完全相同.请记住,objective-c中有很少的原语(int是最明显的原语).大多数情况下,您正在创建类型为对象X的指针(比如NSString),然后分配一块内存(通过[[Object alloc] init])并将该块的起始地址分配给指针.与我们在C中使用我们的字符串完全相同.