【问题标题】:Why do I have to write *myPointerVar only SOMETIMES in Objective-C?为什么我必须在 Objective-C 中只写 *myPointerVar?
【发布时间】:2010-10-09 13:27:39
【问题描述】:

这是一个我仍然不明白的问题。

有时我不得不写:

NSString* myVariable;
myVariable = @"Hey!";

然后,例如我定义一个结构“DemoStruct”并获得一个使用它的变量。假设我有一个结构,其中包含 double 类型的 x 和 y 变量。

我想将此 var 传递给一个方法,该方法然后操作我的 var,并且我希望此操作对我将 var 传递给该方法的上下文产生影响。所以我需要一个指针,对吧。

我将它传递给这样的方法:

[someObject someMethod:&myVarThatUsesTheStruct]

该方法现在看起来像这样:

- (void)someMethod:(DemoStruct*)myVar {
(*myVar).x += 10;
}

在调用之前,结构的组件 x 可以说是 1000。现在,添加了 10,在方法调用之后是 1010。

但我真的很难不明白为什么我必须在方法中为 myVar 使用星号 *,因为我已经在方法头中说过 myVar 是指向 DemoStruct 的指针。我只是用 &myVarThatUsesTheStruct 传递内存地址。

有人能解释一下为什么会这样吗?

【问题讨论】:

    标签: c objective-c pointers


    【解决方案1】:

    正如你所说,myVar 是一个指针。因此,myVar.x 是不正确的:它将通过指针的字段,这在 C/Objective-C 中没有意义。

    如果要访问指针指向的变量,必须加星号:myVar是指针,*myVarmyVar指向的变量。

    此外,在您的情况下,您可以通过编写 myVar->x 来使用 C 的特殊构造,它严格等同于 (*myVar).x

    所有这些都是标准 C,而不是特定于 Objective-C。

    关于您的第一个示例,您不必添加星号,因为您更改的是指针的值,而不是变量的值:myVariable 是一个指向在声明时分配了 @ 的对象的指针987654328@ 值。下一条指令 (myVariable = @"Hey!") 是指针值的赋值:@"Hey!" 是指向 NSString 对象的指针。这个指针的值(不是被指向的常量的值)被赋值给myVariable,然后它指向对象@"Hey!"

    是的,这第一次很难理解...

    【讨论】:

    • 我不同意你的最后一句话“这第一次很难理解”。只有当你学习第一门高级语言并下降时,这才是困难的。从底层往上走,这些都是编程中最简单的事情!
    • 是的,当我写这最后一句话时,我的想法是:“对于指针教程,学习一门汇编语言”
    【解决方案2】:

    * 是取消引用运算符。 *myVar 的全部意思是“把指针 myVar 指向的东西给我”。您需要这种区别,因为您需要告诉计算机您要更改 myVar 指向的东西,而不是 myVar 本身。

    【讨论】:

      【解决方案3】:

      取自学习目标 c 链接,通过 iPhone 开发者门户网站:

      Objective-C 支持变量的强类型和弱类型 包含对象。强类型变量包括类名 变量类型声明。弱类型变量使用类型 id 代替对象。弱类型变量经常用于 诸如集合类之类的东西,其中对象的确切类型 在一个集合中可能是未知的。如果你习惯强烈使用 类型语言,你可能会认为使用弱类型 变量会导致问题,但它们实际上提供了巨大的 灵活性并在 Objective-C 中实现更大的活力 程序。

      以下示例显示了强类型变量和弱类型变量 声明:

      MyClass *myObject1; // 强类型

      id myObject2; // 弱类型化

      注意第一个声明中的 *。在 Objective-C 中,对象 引用是指针。如果这对您来说不完全有意义, 不用担心——您不必成为有指针的专家也能 开始使用 Objective-C 编程。你只需要记住把 强类型对象的变量名前面的 * 声明。 id 类型意味着一个指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-15
        • 2021-12-12
        • 2010-09-24
        • 2020-08-13
        相关资源
        最近更新 更多