【问题标题】:What does the Asterisk * mean in Objective-C?星号 * 在 Objective-C 中是什么意思?
【发布时间】:2010-10-09 13:30:22
【问题描述】:

星号总是意味着“嘿,那是一个指针!”是真的吗? 而一个指针总是持有一个内存地址?

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

例如:

NSString* myString;

SomeClass* thatClass;

(*somePointerToAStruct).myStructComponent = 5;

我觉得我需要了解的关于 Asterirsk (*) 的知识比我在定义作为类指针的变量时使用的要多。

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

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

当我在 NSString* myString 的上下文中使用 Asterisk 时,我可以随意访问 myString,而无需每次都告诉编译器它是一个指针。即喜欢使用 *myString = @"yep"。

这对我来说毫无意义。

【问题讨论】:

标签: objective-c pointers


【解决方案1】:

an * 实际上是一个取消引用指针的运算符。唯一一次表示“嘿,我是指针”是在变量声明期间。

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)

【讨论】:

  • 在声明过程中没有任何不同——Foo* foo 实际上是Foo *foo,如“*fooFoo”。这是完全一致的。
  • 在声明期间放置星号是否重要?什么是好的做法? (即Foo* fooFoo *foo
【解决方案2】:

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 结构的成员。

确保您清楚区别。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多