我刚开始学习目标c,星号给我带来了一些麻烦。当我查看示例代码时,有时它会在声明变量时使用,有时则不会。什么是应该使用它的“规则”。我认为它与变量的数据类型有关。 (对象数据类型需要星号,像int这样的简单数据类型不需要)但是,我已经看到对象数据类型如CGPoint声明没有星号?是否有确定的答案或者它与您使用变量的方式和内容有关?
答案 0 :(得分:17)
什么是应该使用它的“规则”。
使用星号来声明指针。
对于Cocoa对象,您总是声明一个指针,因此您始终使用星号。你不能把对象本身放入变量中;你总是处理一个指向对象的指针。
对于其他事情,它取决于变量是否包含对象(在C意义上)或指向对象的指针 - 其他地方。如果变量应该包含该对象,那么您不要用星号声明它,因为您没有在其中放置指针。如果它应该包含一个指针,那么你确实用星号声明它。
你甚至可以有一个指针指针;正如您所料,这涉及多个星号。例如,NSRect **
是指向NSRect(它是一个结构,而不是Cocoa对象)的指针。
我认为它与变量的数据类型有关。 (对象数据类型需要星号,对于像int这样的简单数据类型不需要)
排序。 Cocoa对象需要星号,因为您只能处理指向Cocoa对象的指针,而不能处理对象本身。但是Cocoa对象的声明规则也没有什么不同;它们完全一样。如果需要指针变量,可以使用星号;你不想要一个非指针变量。
唯一的例外,Cocoa对象与通常规则的唯一区别在于,不允许声明保存对象本身的变量。这就是为什么你永远不会看到一个变量持有一个Cocoa对象而不是指向一个的变量:编译器不会允许它。
但是,我已经看到对象数据类型如CGPoint声明没有星号?
CGPoint是一个结构,而不是Cocoa对象。因此,您可以声明一个包含CGPoint的变量,而不是指向其他位置的指针。
答案 1 :(得分:7)
我认为你应该首先阅读C编程。 Objective-C是C的超集。 您不使用*来声明CGPoint的原因是因为CGPoint是一个结构体,请查看CGGeometry.h头文件。
答案 2 :(得分:6)
星号表示变量是指向数据类型的指针。
您应该查看pointers以获取更多信息。它们是编程的一个非常重要和基本的方面。
答案 3 :(得分:4)
当变量类型是类时,使用*
。
一个例子可能有帮助。
NSNumber *number;
NSInteger integer;
NSNumber
变量类型是一个类,而NSInteger
只是普通C类型int
的另一个名称。正如您在此处所看到的,编译器会将NSInteger
的每次出现替换为int
:
#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
此外,您不能在不使用指针的情况下声明类(对象)的实例,如NSNumber
(因此您使用*
)。这样做的原因是,当您alloc
一个类的实例作为对象时,将返回一个内存地址。指针是一种特定于内存位置的变量。例如:
NSNumber *number = [NSNumber alloc];
此处number
的数值将是0x19a30c0
之类的内存位置。您可以通过添加和减去来操作它,就像int
一样。将其声明为NSNumber
指针的关键目的是编译器可以帮助编码器验证该类是否具有某些方法或访问已知属性。
最后一个例子:
NSInteger integer = [NSNumber alloc];
integer
的价值是多少?在我们的例子中,它将是0x19a30c0。有了这个,您实际上仍然可以通过NSNumber
访问新分配的[integer someMethod]
对象。但编译器会给你一个警告。更多:
integer += 4;
这会影响数值0x19a30c0
,只需向其添加4并使其成为0x19a30c4
。
请查看有关C/C++ pointers的维基百科文章,了解有关如何,何时以及为何使用*
运算符的更多示例。
答案 4 :(得分:0)
听起来你已经找到了规则:指针的星号,否则没有星号。麻烦的是,没有规则来确定像CGPoint这样的东西是否需要指针而不查看头文件。正如Welbog所说,何时使用/不使用指针的真正区别在于您是在堆还是堆栈上进行分配,尽管大多数情况下您只需要确定是否正在使用对象(星号)或原语(没有星号)。
答案 5 :(得分:0)
答案非常简单:在使用Objective-C对象时,始终应使用星号。
原因是它们无法在堆栈中分配,因此您无法对CGPoint等结构执行任何操作。
我想,Objective-C的设计者选择让你总是添加星号,因为它们像其他C指针一样指向内存。