42

I'm trying my hand at the iPhone course from Stanford on iTunes U and I'm a bit confused about pointers. In the first assignment, I tried doing something like this

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

Which generated an error, after tinkeing around blindly, I discovered that it was the * in the NSInteger line that was causing the problem.

So I obviously don't understand what's happening. I'll explain how I think it works and perhaps someone would be kind enough to point out the flaw.

Unlike in web development, I now need to worry about memory, well, more so than in web development. So when I create a variable, it gets allocated a bit of memory somewhere (RAM I assume). Instead of passing the variable around, I pass a pointer to that bit of memory around. And pointers are declared by prefixing the variable name with *.

Assuming I'm right, what puzzles me is why don't I need to do that for NSInteger?

4

5 回答 5

72

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

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

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

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

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

NSInteger *pointerToProcessID = &processID;

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

于 2009-06-18T17:32:46.007 回答
25

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

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

如果在 32 位应用程序中使用,则为 32 位整数,如果在 64 位应用程序中构建,则为 64 位整数。

当然,您可以将 anNSInteger作为指针传递,但大多数函数只是将参数作为 anNSInteger而不是指向它的指针。

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

于 2009-06-18T17:32:18.130 回答
3

意思是“*指针”。object 变量持有一个指向对象的指针,所以它有一个*; NSInteger 变量包含一个 NSInteger,而不是指向 NSInteger 的指针,因此它没有*. 将*放在该变量上至少会给您一个警告,因为您将整数放入指针变量中。

于 2009-06-18T17:54:59.043 回答
2

NSInteger 只是 AFAIK 的 int 的 typedef。

于 2009-06-18T17:33:15.380 回答
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
于 2019-05-01T15:35:45.503 回答