我正试着在iTunes U上从斯坦福大学学习iPhone课程,我对指针感到有些困惑。在第一个作业中,我尝试过做这样的事情

NSString *processName = [[NSProcessInfo processInfo] processName];
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

这产生了一个错误,在盲目地修复之后,我发现它是导致问题的NSInteger系列中的*。

所以我显然不明白发生了什么。我将解释我认为它是如何工作的,也许有人会善意地指出这个缺陷。

  

与网络开发不同,我现在需要   担心内存,嗯,比在Web开发中更多。所以,当我   创建一个变量,它被分配了一个   有点内存(RAM I   假设)。而不是通过   变量周围,我传递一个指针   那段记忆。和   指针是通过前缀来声明的   带*的变量名。

假设我是对的,令我困惑的是为什么我不需要为NSInteger做那个?

有帮助吗?

解决方案

NSInteger 是一种基本类型,这意味着可以本地存储在堆栈中。您不需要使用指针来访问它,但如果您愿意,也可以。这一行:

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

返回实际变量,而不是其地址。要解决此问题,您需要删除 *

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

如果你真的想要一个 NSInteger ,你可以有一个指针:

NSInteger *pointerToProcessID = &processID;

&符号是运算符的地址。它将指向 NSInteger 的指针设置为等于内存中变量的地址,而不是变量中的整数。

其他提示

您未使用 * 声明 NSInteger 的原因是因为它不是对象。 NSInteger只是 int long

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif

如果它在32位应用程序中使用,它是一个32位整数,如果它是在64位应用程序中构建的,那么它是一个64位整数。

当然,你可以传递一个 NSInteger 作为指针,但大多数函数只是将参数作为 NSInteger 而不是指针它。

另一方面,

对象只能作为指针传递给其他函数。这是因为对象具有为它们动态分配的内存,因此无法在堆栈上声明。由于 int long 具有为其分配的固定内存量,因此这不是问题。

* 表示“指针”。对象变量包含指向对象的指针,因此它具有 * ; NSInteger变量包含NSInteger,而不是指向NSInteger的指针,因此它没有 * 。将 * 放在该变量上会给你至少一个警告,因为你将一个整数放入一个指针变量。

NSInteger只是int,AFAIK的一个typedef。

使用指针

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top