为什么指向NSInteger的指针将该值乘以8?

时间:2015-10-15 13:25:08

标签: objective-c pointers nsinteger

在我的标题中,我将一些变量声明为@property (nonatomic) NSInteger *soldWindows;并使用它们来跟踪计数,并以_soldWindows++;递增。结果一直是应有的8倍。我发现我的问题是将其声明为指针,因此我将其更改为@property (nonatomic) NSInteger soldWindows;,这解决了我的问题。

我的问题是,如果它只是存储一个内存地址,为什么整数值按8而不是任意地址?

2 个答案:

答案 0 :(得分:5)

指针指向内存中的某个位置。当你递增这样的指针时,你增加指针的值,指向内存中的新位置。鉴于此,您可以使用指针算法通过取消引用递增的指针来迭代数组中的连续元素。因此,您不会增加1,而是增加指针类型的大小。 NSInteger只不过是64位或32位int,具体取决于平台。在这种情况下,它似乎是64位,即8字节。这是你的8位"缩放"是来自。

结论:您的修复是正确的!

答案 1 :(得分:0)

  

我宣布了一些变量为[...] NSInteger * soldWindows;并用它们来记录计数。

你在滥用指针的概念。在C中,指针是内存中对象的地址。在您的用例中,没有任何对象被指向 - 只是指向无处的地址。

虽然这不是一个问题,只要你不取消引用指针它仍然令人困惑(并且没有任何帮助)。一个简单的整数(如intNSInteger)是更好的选择。

  

为什么整数值按8?

缩放

其原因称为指针算术。每个C指针都有一个类型。该类型描述了指针保存地址的内存中的对象。当您递增指针时,编译器实际上会将对象的大小添加到指针,以便它指向前一个对象之后的对象。

NSInteger(在64位iOS中)的大小为64位= 8字节。这就是为什么递增NSInteger *实际上会增加8。