【问题标题】:Why the usage of instance pointers is different than the usage of number pointers (objective-c, Mac)为什么实例指针的用法与数字指针的用法不同(objective-c,Mac)
【发布时间】:2011-04-13 13:19:39
【问题描述】:

最近我开始在Mac上学习objective-c,但我偶然发现了指针的基本用法。到目前为止,我有了使用数字指针的想法:

int x = 1; // initializing main variable x
int *y; //  initializing variable y of the int type pointer
y = &x; // passing the reference
*y = *y + 1; // working with a value via passed reference

让我们看看另一个例子,例如 NSString 对象:

NSString *comp; // initializing a pointer of NSString type. 
comp = @"Mac"; // ???

问题是,我不明白为什么可以使用不带星号的 comp = @"Mac" 而不是使用 with *comp = @"Mac"?在处理对象指针时它是某种快捷方式吗?如果将相同的语法规则应用于简单数据类型指针和对象类型指针,那将更清楚(对我来说:))。我知道objective-c中几乎所有的对象变量都是指针,但是这样的语法是什么原因呢?

【问题讨论】:

    标签: objective-c pointers nsstring


    【解决方案1】:

    Objective C 对象不像您的数字示例那样是值。实际的数据结构对程序员来说几乎是不透明的,并由运行时管理。您所处理的只是指向它的指针。您实际上从未直接修改指向的内容,而是发送导致其被修改的消息。而使用指向int 的简单指针,您就可以直接进入其中并自己更改内容x 的值)。

    NSString 示例是一个稍微特殊的情况,让人感到困惑一点也不无道理。交易是这个位:@"Mac" 在某处实例化字符串对象的内存,但它实际上返回给您分配的只是指向该对象的 指针。所以这一行:

    comp = @"Mac";
    

    是将右侧的指针 (@"Mac") 分配给左侧的指针变量 (NSString* comp)。在任何一方,你都没有真正直接处理价值,它看起来就像你一样。

    所有这些都以这种方式工作的原因,而不是像 Java 这样更直观的方式,是因为它全部基于 C 并且使用相同的语法。但好处是,一旦你习惯了它,它就会不断提醒你,你只是在处理对象的引用,而细节是在幕后管理的. (这是一件好事,老实说。)

    【讨论】:

      【解决方案2】:

      一开始可能会让人很困惑,但一旦你分解了每个运算符的用途,就会更容易理解。

      & 是一个引用运算符,它只是返回特定变量在内存中的地址。

      int a = 5;
      // a  == 5        the value
      // &a == 0x1000   the address
      

      星号 (*) 是取消引用运算符,指针值是地址,使用星号会返回其指向的值。

      int a = 5;
      int b = &a;
      // a  == 5        the value
      // &a == 0x1000   the address
      // b  == 0x1000   the value of b is the address of a
      // *b == 5        the value of b is an address that points to the value of 5
      

      所以在...的情况下...

      NSString *aString;
      aString = @"this is a string"
      

      幕后发生的事情是将@“这是一个字符串”的地址分配给aString的值。使用字符串时,您不会取消引用它,因为这只会指向该对象占用的第一个内存块的值,这是无用的,因为您将整个对象视为一个整体。

      【讨论】:

        【解决方案3】:

        星号仅用于变量声明中,表示该值是一个指针,除此之外,它会取消引用一个指针,正如您在第一个示例中指出的 *y = *y + 1

        @"" 文字是 NSString *(NSString 指针),类似于 "" 文字是 const char *(常量字符指针)。

        在您的示例中,执行以下操作是相同的。

        NSString *comp;
        comp = @"Mac";
        //^^ is the same as
        NSString *comp = @"Mac";
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多