Asterisk *在Objective-C中的含义是什么?

时间:2009-02-24 13:19:27

标签: objective-c pointers

这是真的,Asterisk总是意味着“嘿,这是一个指针!” 指针总是有一个记忆地址?

(是的,我知道a *用于数学运算的例外)

例如:

NSString* myString;

SomeClass* thatClass;

(*somePointerToAStruct).myStructComponent = 5;

我觉得我更需要了解Asterirsk(*),而不是在定义一个指向类的指针的变量时使用它。

因为有时我已经在参数声明中说过Parameter变量是一个指针,但我仍然必须在变量前面使用Asterisk才能访问该值。最近发生的事情发生在我想以类似[myObj myMethod:& myStruct]的方式将结构的指针传递给方法之后,即使我的方法声明已经说过,我也无法从该结构访问组件值参数(DemoStruct *)myVar确实应该被称为指向该demostruct的指针,我仍然总是说:“人,编译器。听!它IIISSS指针:”并写:(* myVar).myStructComponentX = 5 ;

我真的真的不明白为什么我要说两次。只有在这种情况下。

当我在NSString * myString的上下文中使用Asterisk时,我可以访问myString但是我喜欢,而不是每次都告诉编译器它是指针。即使用* myString = @“yep”。

这对我来说毫无意义。

3 个答案:

答案 0 :(得分:26)

* *实际上是一个取消引用指针的运算符。唯一一次它意味着“嘿我是指针”是在变量声明期间。

Foo* foo  // declare foo, a pointer to a Foo object
&foo      // the memory address of foo
*foo      // de-reference the pointer - gives the Foo object (value)

答案 1 :(得分:4)

mmattax很好地涵盖了声明(作为指针)和解除引用之间的区别。

但是,关于你的观点:


  (*myVar).myStructComponentX = 5;

要访问C结构实例的成员(就像这样),您可以执行您所做的操作,或者更常见的是使用->符号:


  myVar->myStructComponentX = 5;

Objective-C在这里有点令人困惑,因为它最近(在ObjC 2.0中)引入了属性语法,这是一个捷径:


  int val = [myObject someIntProperty];

现在可以写成:


  int val = myObject.someIntProperty;

这是Objective C(2.0)语法,用于访问您声明的属性(不是实际的成员变量),而您的示例是访问C结构的成员。

确保你清楚区别。

答案 2 :(得分:0)

正如我在my answer of your previous question中所说,@"yep"已经是一个指针,因此*之前不需要myString,它也是一个指针。在这种情况下,您指定指针而不是值。