我正试着在iTunes U上从斯坦福大学学习iPhone课程,我对指针感到有些困惑。在第一个作业中,我尝试过做这样的事情
NSString *processName = [[NSProcessInfo processInfo] processName];
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];
这产生了一个错误,在盲目地修复之后,我发现它是导致问题的NSInteger系列中的*。
所以我显然不明白发生了什么。我将解释我认为它是如何工作的,也许有人会善意地指出这个缺陷。
与网络开发不同,我现在需要 担心内存,嗯,比在Web开发中更多。所以,当我 创建一个变量,它被分配了一个 有点内存(RAM I 假设)。而不是通过 变量周围,我传递一个指针 那段记忆。和 指针是通过前缀来声明的 带*的变量名。
假设我是对的,令我困惑的是为什么我不需要为NSInteger做那个?
答案 0 :(得分:68)
NSInteger
是一种原始类型,这意味着可以本地存储在堆栈中。您不需要使用指针来访问它,但如果您愿意,也可以。这一行:
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];
返回实际变量,而不是其地址。要解决此问题,您需要删除*
:
NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];
如果你真的想要一个NSInteger
,你可以有一个指针:
NSInteger *pointerToProcessID = &processID;
&符号是运算符的地址。它将指向NSInteger
的指针设置为等于内存中变量的地址,而不是变量中的整数。
答案 1 :(得分:25)
您没有使用NSInteger
声明*
的原因是因为它不是对象。 NSInteger只是int
或long
:
#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif
如果它在32位应用程序中使用,它是一个32位整数,如果它是在64位应用程序中构建的,那么它是一个64位整数。
当然,可以传递NSInteger
作为指针,但大多数函数只是将参数作为NSInteger
而不是指向它的指针。
对象只能作为指针传递给其他函数。这是因为对象具有为它们动态分配的内存,因此无法在堆栈上声明。由于int
或long
为其分配了固定数量的内存,因此这不是问题。
答案 2 :(得分:3)
*
表示“指针”。对象变量包含指向对象的指针,因此它具有*
; NSInteger变量包含NSInteger,而不是指向NSInteger的指针,因此它没有*
。将*
放在该变量上会给你至少一个警告,因为你将一个整数放入一个指针变量。
答案 3 :(得分:2)
NSInteger只是int,AFAIK的一个typedef。
答案 4 :(得分:0)
使用指针
NSInteger integer1 = 1;
NSLog(@"1. integer1:%ld &integer1:%p", integer1, &integer1);
//1. integer1:1 &integer1:0x7ffee59e8a98
NSInteger *integer2 = &integer1;
NSLog(@"2. integer2:%p &integer2:%p *integer2:%ld", integer2, &integer2, *integer2);
//2. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:1
*integer2 = 2;
NSLog(@"3. integer2:%p &integer2:%p *integer2:%ld \t integer1:%ld &integer1:%p", integer2, &integer2, *integer2, integer1, &integer1);
//3. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:2 integer1:2 &integer1:0x7ffee59e8a98