NSInteger = NSInteger -1?

Rei*_*ill 2 objective-c

我想做一件非常简单的事,但我无法弄清楚如何;

NSInteger * a=10;
a=a-1;
NSlog(@"a=%d",a);
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它正在显示a=6.

怎么会这样?

Aly*_*oss 8

您的问题是您已将变量声明a为指针.大多数Objective-C变量都是指针,但是NSInteger是一个例外,因为它只是typedef' int或者' long.

您的代码应如下所示:

NSInteger a=10;
a=a-1;
NSlog(@"a=%d",a);
Run Code Online (Sandbox Code Playgroud)

当您对指针进行数学运算时,实际上是在移动它所指向的内存中的位置.例如,如果a的大小NSInteger为4(sizeof(NSInteger) == 4),将其移动-1,或者换句话说,返回一个结构大小,则指针减少4.当迭代结构数组时,此机制在C中大量使用,例如

CGPoint myPoints[4];
CGPoint* point = myPoints; //get the first point

for (NSUInteger i = 0; i < 4; i++) {
   CGPoint currentPoint = *point;
   point++; //moves to the next point, adding sizeof(CGPoint)
}
Run Code Online (Sandbox Code Playgroud)

这称为指针算法,您可以用不同的方式编写它,例如pointer + 1但也point[1]可以1[point](或者后两个实际上等于*(pointer + 1)).

  • 你应该解释为什么一个指针,也是一个整数,当你做-1时移动-4 :) (4认同)