我为什么不用*声明NSInteger
-
06-07-2019 - |
题
我正试着在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