在Objective-C中放置星号

53 pointers objective-c

我刚开始学习Objective-C,来自VB .Net和C#.Net背景.我理解指针用法,但在Objective-C示例中,我看到星号放在几个不同的地方,并尽可能搜索,我无法找到答案为什么会这样.我尝试的每一次搜索都会出现关于指针的各种解释(我真的不需要),但没有提到星号不同位置的原因/影响.以下是我见过的一些例子:

NSString *string;
NSString * string;
(NSString *) string;
NSString* string;
Run Code Online (Sandbox Code Playgroud)

星号的这些不同位置是什么意思?我确信这是一个简单的答案,但到目前为止,无法在任何Apple教程和参考文档或在线中找到它是令人沮丧的.

有人可以结束我的痛苦并回答这个令人困惑的问题吗?谢谢!

dcr*_*sta 32

没有区别,但是你应该知道只有第一个"令牌"(可以这么说)定义了类型名称,而*不是类型名称的一部分.也就是说:

NSString *aString, bString;
Run Code Online (Sandbox Code Playgroud)

创建一个指针-TO- NSString,和一个NSString.要使两者成为指针,请执行以下任一操作:

NSString *aString, *bString;
Run Code Online (Sandbox Code Playgroud)

要么:

NSString *aString;
NSString *bString;
Run Code Online (Sandbox Code Playgroud)

  • ...当然你不能声明一个不是指针的NSString变量(在POC方言之外),所以第一个代码示例不会编译. (2认同)
  • `NSString*aString,bString`会创建两个指向NSStrings的指针吗? (2认同)

mar*_*rcc 23

1.  NSString *string;
2.  NSString * string;
3.  (NSString *) string;
4.  NSString* string;
Run Code Online (Sandbox Code Playgroud)

1,2和4完全相同.这都是风格.选择你想要的任何东西,或混合起来.

选择#3还有另一个含义,它用于铸造.例如:

t = (NSString *)string ;
Run Code Online (Sandbox Code Playgroud)

string转换为NSString指针.

但是选择#3是您可能在.h文件或.m文件中的函数定义中使用的语法.在实际函数内部,在"运行"的代码中,它具有不同的含义.

  • 如果从NSObject开始并转换为多种不同类型,则需要显式转换为NSString. (2认同)

Chu*_*uck 19

没有区别 - 这是一种风格问题.它们都声明了一个变量,称为string指向NSString的指针.括号在某些情况下(特别是方法声明)是必要的,以便澄清它是一种类型声明.

  • 然而,我更喜欢最后一种形式(来自C++背景):它清楚地划分了类型和对象.以下是Stroustrup对此主题的一个很好的讨论:http://www.research.att.com/~bs/bs_faq2.html#whitespace (4认同)

kni*_*ttl 6

你把星号放在哪里都没关系,所有语句都创建NSString类型的指针.

当在一行中使用多个变量名时,您必须为每个变量编写星号.

NSString * nsstring, * nsstring2;
Run Code Online (Sandbox Code Playgroud)

  • ......这是C中最丑陋的东西之一,因此应该避免. (9认同)

Bar*_*ark 6

1.  NSString *string;
2.  NSString * string;
3.  (NSString *) string;
4.  NSString* string;
Run Code Online (Sandbox Code Playgroud)

1,2和4是等价的.C语言(和C的Objective-C超集)指定对空白区域不敏感的语法.因此,您可以根据自己的喜好自由添加空间.所有相关的语法由非空白字符分隔(例如{,},;等)[1].

3是一个类型转换(告诉C编译器使用该NSString*类型而不管声明的类型string.在Objective-C中,很少需要类型转换对象实例.你可以使用id类型作为可以引用任何对象实例的变量类型.

在方法声明中,语法3(有时没有结束分号)用于声明方法参数的类型.Objective-C方法可能如下所示:

- (void)myMethodThatTakesAString:(NSString*)string;
Run Code Online (Sandbox Code Playgroud)

在此声明中,名为的参数string类型为type NSString*(前导-表示实例方法与类方法相对).具有多个参数的方法声明可能如下所示:

- (void)myMethodTakingAString:(NSString*)string andAnInteger:(NSInteger)intParam;
Run Code Online (Sandbox Code Playgroud)

[1]这与使用空格作为块分隔符的Python等语言进行了比较.


Joh*_*kin 5

没有区别,*放在指针声明中的位置是无关紧要的.


enn*_*ler 2

实际上所有等价物:指向 nsstring 的指针!!