【问题标题】:Why does a pointer to an NSInteger multiply the value by 8?为什么指向 NSInteger 的指针将值乘以 8?
【发布时间】:2015-10-15 13:25:08
【问题描述】:

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

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

【问题讨论】:

  • 除了 ChrisCM 的正确答案之外,似乎没有什么特别的原因可以让您使用 NSInteger。所以只需使用 int intead。
  • @fishinear 根据目标,NSIntegerintlong 的 typedef。那么切换到int 有什么好处呢?
  • @fishinear 不好的建议。
  • 小伙伴们别紧张,这是风格问题,不是很重要的风格,所以强烈的反应有点过头了。提到的变量“soldWindows” - 即“已售窗口的数量” - 似乎与引入 NSInteger 的 Apple API 没有任何关系。因此,使用该类型而不是普通的 C 类型可能会造成混淆。

标签: objective-c pointers nsinteger


【解决方案1】:

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

结论:你的修正是正确的!

【讨论】:

  • 你的解释是正确的。该示例相当令人困惑(如果是实际代码,则错误)。
  • “当[...]你增加它指向的内存位置”听起来像是指针被增加,而不是指针。那是错误的。指针中的地址是递增的,而不是内存中的位置。
【解决方案2】:

我将一些变量声明为 [...] NSInteger *soldWindows;并使用它们来跟踪计数。

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

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

为什么整数值按 8 缩放?

原因被称为指针算法。每个 C 指针都有一个类型。类型描述了指针保存地址的内存中的对象。当你增加一个指针时,编译器实际上将对象的大小加到指针上,这样它就指向前一个对象之后的对象。

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

【讨论】:

  • @ChrisCM 我假设 OP 正在使用指针作为其值(可能初始化为 NULL 左右)。他看到值以 8 为增量递增,因此他将指针值用作整数标量值。我认为他实际上并没有指向某些东西(除了虚拟内存中的随机地址,这就是我所说的“无”)。取消引用指针将是未定义的行为。
猜你喜欢
  • 1970-01-01
  • 2012-10-07
  • 2012-08-20
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多