Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么有时我必须用Objective-C编写*myPointerVar?_C_Objective C_Pointers - Fatal编程技术网

为什么有时我必须用Objective-C编写*myPointerVar?

为什么有时我必须用Objective-C编写*myPointerVar?,c,objective-c,pointers,C,Objective C,Pointers,这是一个我仍然不理解的问题 有时我不得不写: NSString* myVariable; myVariable = @"Hey!"; 然后,例如,我定义了一个结构“DemoStruct”,并得到一个使用它的变量。假设我有一个由double类型的x和y变量组成的结构 我想把这个var传递给一个方法,然后这个方法会对我的var进行操作,我想这个操作会对我将var传递给那个方法的上下文产生影响。所以我需要一个指针,对吗 我将其传递给如下方法: [someObject someMethod:&

这是一个我仍然不理解的问题

有时我不得不写:

NSString* myVariable;
myVariable = @"Hey!";
然后,例如,我定义了一个结构“DemoStruct”,并得到一个使用它的变量。假设我有一个由double类型的x和y变量组成的结构

我想把这个var传递给一个方法,然后这个方法会对我的var进行操作,我想这个操作会对我将var传递给那个方法的上下文产生影响。所以我需要一个指针,对吗

我将其传递给如下方法:

[someObject someMethod:&myVarThatUsesTheStruct]
- (void)someMethod:(DemoStruct*)myVar {
(*myVar).x += 10;
}
该方法现在看起来如下所示:

[someObject someMethod:&myVarThatUsesTheStruct]
- (void)someMethod:(DemoStruct*)myVar {
(*myVar).x += 10;
}
在调用之前,结构的组件x是1000。现在,添加10,在方法调用之后为1010

但是我真的很难理解为什么我必须在方法中使用星号*表示myVar,因为我已经在方法头中说过myVar是指向DemoStruct的指针。我只是将使用结构的&myvarthat传递给内存地址


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

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

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

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

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

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


是的,这在第一次执行时很困难…

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

摘自iphone开发者门户网站上的学习目标c链接:

Objective-C支持变量的强类型和弱类型 包含对象。强类型变量包括中的类名 变量类型声明。弱类型变量使用类型id 而不是对象。弱类型变量经常用于 例如集合类,其中对象的确切类型 在一个集合中可能是未知的。如果您习惯于使用 类型化语言,您可能认为使用弱类型 变量会引起问题,但它们实际上提供了巨大的 灵活性,并允许Objective-C具有更大的动态性 节目

下面的示例显示强类型变量和弱类型变量 声明:

MyClass*MyObject 1;//强类型

id myObject2;//弱类型

注意第一个声明中的*。在Objective-C中,object 引用是指针。如果这对你来说没有完全意义, 别担心,你不必是一个有指针的专家就可以 从Objective-C开始编程。你只需要记住 强类型对象的变量名前面的*号 声明。id类型意味着一个指针


我不同意你最后一句话“第一次很难理解”。只有当你先学习高级语言,然后继续学习下去,这才是困难的。从低级向上使这些成为编程中最简单的事情!是的,当我写下最后一句话时,我的想法是:“对于指针的教程,学习汇编语言”