我正试着在iTunes U上从斯坦福大学开始学习iPhone课程,我对指针感到有些困惑.在第一次任务中,我尝试过做这样的事情
NSString *processName = [[NSProcessInfo processInfo] processName]; NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];
这产生了一个错误,在盲目地修复之后,我发现它是导致问题的NSInteger系列中的*.
所以我显然不明白发生了什么.我将解释我认为它是如何工作的,也许有人会善意地指出这个缺陷.
与Web开发不同,我现在需要担心内存,而不是Web开发.因此,当我创建一个变量时,它会在某处分配一些内存(我假设是RAM).我没有传递变量,而是将指针传递给周围的内存.并且通过在变量名前加上*来声明指针.
假设我是对的,让我感到困惑的是为什么我不需要为NSInteger做那个?
NSInteger
是一种原始类型,这意味着它可以本地存储在堆栈中.您不需要使用指针来访问它,但如果您愿意,也可以.这条线:
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];
返回一个实际变量,而不是它的地址.要解决此问题,您需要删除*
:
NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];
你可以有一个指针,NSInteger
如果你真的想要一个:
NSInteger *pointerToProcessID = &processID;
&符号是运算符的地址.它将指针设置为NSInteger
等于内存中变量的地址,而不是变量中的整数.
你不用NSInteger
a 声明的原因*
是因为它不是一个对象.NSInteger只是一个int
或一个long
:
#if __LP64__ typedef long NSInteger; #else typedef int NSInteger; endif
如果它在32位应用程序中使用,它是一个32位整数,如果它是在64位应用程序中构建的,那么它是一个64位整数.
当然,您可以传递NSInteger
一个指针,但大多数函数只是将参数作为一个NSInteger
而不是指向它的指针.
另一方面,对象只能作为指针传递给其他函数.这是因为对象具有为它们动态分配的内存,因此无法在堆栈上声明.由于为它们分配int
或long
具有固定数量的内存,因此这不是问题.