Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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中?_Objective C - Fatal编程技术网

您将指针指示器放置在何处有何含义*&引用;在Objective-C中?

您将指针指示器放置在何处有何含义*&引用;在Objective-C中?,objective-c,Objective C,这是一个令人尴尬的简单问题,在我深入研究目标C时,我一直未能找到答案: 在声明或分配变量时,指针指示器“*”放在何处有什么意义 我见过以不同方式定义的变量: NSString *BLANK_SPACE = @" "; NSString const *BLANK_SPACE = @" "; NSString * const BLANK_SPACE = @" "; 现在我知道常量修饰符的意思了,但我之所以把它放在这里,是因为当我看到星号被空格隔开时,它通常在常量修饰符之前 有人能解释一下

这是一个令人尴尬的简单问题,在我深入研究目标C时,我一直未能找到答案:

在声明或分配变量时,指针指示器“*”放在何处有什么意义

我见过以不同方式定义的变量:

 NSString  *BLANK_SPACE = @" ";
 NSString const *BLANK_SPACE = @" ";
 NSString * const BLANK_SPACE = @" "; 
现在我知道常量修饰符的意思了,但我之所以把它放在这里,是因为当我看到星号被空格隔开时,它通常在常量修饰符之前


有人能解释一下在声明/分配变量时将*放在何处的基本原理吗?区别是什么?

相对于变量名的*位置对编译器来说并不重要。不过,有些人更喜欢将*与变量放在一起,因为这样可以避免在声明多个变量时可能出现的混淆:

char* a, b;  // a is char* and b is char, but both look like char*
char *a, b;  // looks a little more like the truth: a is char*, b is char
但是,您总是通过指针引用Objective-C中的对象,因此您永远不会执行下面第一行的操作:

NSString *a, b;  // WRONG: a is a pointer to an NSString object, b is just wrong.
NSString *a, *b; // OK: both a and b are pointers to NSString objects
另一方面,
const
的位置确实会产生影响:

int * const a; // a points to an int, and a can't be modified to point to some other int
int const * a; // a points to an int, and that int can't be changed
现在,
const
对于对象没有多大意义。首先,NSString表示一个不可变的字符串,因此声明一个
const
不会增加太多内容。另一方面,在Objective-C中,通常通过发送消息来修改对象,而不是直接更改对象的IVAR,我认为编译器不会阻止通过消息进行更改。因此,一个
const
指针是有意义的,一个指向
const
对象的指针,与其说是:

NSString * const BLANK_SPACE = @" "; // makes sense; pointer BLANK_SPACE can't change
NSString const * BLANK_SPACE = @" "; // not useful

const
是一个后缀运算符,它将对象指向其左侧,而不是右侧。如果
常量
位于第一位,则它将应用于其后的第一件事
const NSString*foo
(以及
NSString const*foo
)表示它是指向const NSString的非常量指针-指针值可以重新分配,但指向的数据是不可变的
NSString*const foo
表示它是指向非常量NSString的常量指针-指向的数据可以更改,但指针指向的位置不能更改


*
和行的其他部分之间的间距只是样式和清晰度的问题。

技巧是从右到左阅读声明。因此:

NSString  *BLANK_SPACE 
从右到左。。。空格是指向NSString的指针

NSString const *BLANK_SPACE
NSString * const BLANK_SPACE
从右到左。。。空格是指向常量字符串的指针

NSString const *BLANK_SPACE
NSString * const BLANK_SPACE
从右到左。。。空格是指向NSString的常量指针

NSString const *BLANK_SPACE
NSString * const BLANK_SPACE
最后,

NSString const * const BLANK_SPACE

从右到左。。。空格是指向常量NSString的常量指针。

不知道答案,但这是一个非常好的问题:)。如果牛顿想问苏亚克为什么苹果会掉下来?我们不会意识到重力;)好问题。我认为obj-C的“C”部分对于初学者来说是最难的部分所有空格都是可选的——可以是
NSString*myString
NSString*myString
,或
NSString*myString。可能
NSString*myString
是最常见的(也是xCode倾向于自动生成的),但我个人更喜欢
NSString*myString,因为我将声明的“pointerness”与类型关联,而不是与变量关联。但是,在一起声明多个变量时,确实需要小心(
NSString*myString1,*myString2;
),或者更好地避免在同一行上声明多个变量。对于
const
,我最常看到的样式(我更喜欢的样式)是将其放置在类型的左侧(行上的第一件事)声明指向常量值的指针时(这是
const
最常用的用法)。这很难混淆。然后,如果
const
出现在其他任何地方,那就是对自己说“哇!想想这个。”@Daniel-如果我没弄错的话,把const放在第一位,放在类型的左边,不是在声明一个const字符串而不是一个const指针吗?根据下面的评论,我认为这不是您在objective-c中大多数时候真正想要的。
NSString const*
NSString*const
不是一回事。谢谢。这个答案非常简单helpful@lemnar,你当然是对的--我想的是*相对于变量名而不是常量的位置。@Caleb,我很抱歉,在我困惑的时候,无意中同时问了两个问题。@JohnRock,别担心--我已经更新了我的答案,使之更完整,还有几张反对票也没什么大不了的。还请参考@Caleb关于*在风格上哪个位置更合适的回答。这实际上源于C语言和该语言中的一些模糊性,但是Caleb规定的样式确实清楚地说明了*适用于什么。很多年前,我就用C/C++完成了这首歌,虽然它在语言上没有任何区别,但当你回顾过去和被遗忘的代码时,它会带来一个世界的不同!这里还有另一个线程也讨论了常量指针和常量对象之间令人困惑的区别:尽管@Caleb的答案是正确的,但它并没有回答这个问题。
const
的位置确实会有所不同。它决定数据是常量还是指针本身是常量。谢谢-这是一个很好的解释。现在我明白了,让我更加困惑的是这个概念:NSString const*空格。常量字符串是什么意思?我在上面发布的链接()表明这毫无意义。是否有理由创建常量字符串?在Obj-C中,可以公平地说NSString const*语法没有什么意义,因为NSStrings是不可变的,因此已经是常量。这种语法对于非Obj-C类类型(例如int、char)是有意义的,在C++中,CONS的概念也有意义。
NSString const *BLANK_SPACE
NSString * const BLANK_SPACE