如何解决为什么实例指针的用法与数字指针objective-c,Mac的用法不同?
| 最近,我开始学习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 \”而不是与* comp = @ \“ Mac \”一起使用?处理对象指针时,这是某种捷径吗?如果对相同的语法规则同时应用于简单的数据类型指针和对象类型指针,这将更加清楚(对我来说:)。我知道几乎所有对象变量都是Objective-C中的指针,但是这种语法的原因是什么呢?
解决方法
与您的数字示例不同,目标C对象不是值。实际的数据结构对程序员来说几乎是不透明的,并由运行时进行管理。您所要做的就是指向它的指针。您从不实际直接修改所指向的内容,而是发送导致其被修改的消息。只需简单地指向
int
,您就可以在那里直接更改内容((3ѭ的值)。
ѭ4的示例有点特殊,发现它令人困惑并非完全不合理。关键是:“ѭ5”将字符串对象的内存实例化到某个位置,但是实际上分配给您的分配只是指向该对象的指针。所以这行:
comp = @\"Mac\";
是右边的指针(@\"Mac\"
)到左边的指针变量(NSString* comp
)的分配。您实际上并没有直接处理价值,这看起来就像您一样。
所有这些都以这种方式而不是像Java这样的更直观的方式起作用的原因是,因为它们全部基于C并使用相同的语法。但是,一旦习惯了它的好处是,它应该不断提醒您,您只在处理对对象的引用,并且细腻的坚韧不拔是在后台进行管理的。 (老实说,这是一件好事。)
,刚开始时可能会很混乱,但是一旦您破坏了每个操作员的目的,它就会更容易理解。
“&”号是一个引用运算符,它只返回特定变量在内存中的地址。
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\"
幕后发生的事情是将@ \“ this is a string \”的地址分配给aString的值。在使用字符串时,您不会取消引用它,因为那只会指向该对象占用的第一块内存的值,因为您将整个对象作为一个整体来处理,所以它是无用的。
,星号仅在变量声明中使用,以表示该值是一个指针,在该值之外,它将取消引用指针,如您在第一个示例ѭ12中所指出的那样
@ \“ \”文字是is13ѭ(NSString指针),类似于\“ \”文字是const char *
(常量字符指针)。
在您的示例中,执行以下操作是相同的。
NSString *comp;
comp = @\"Mac\";
//^^ is the same as
NSString *comp = @\"Mac\";
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。