NSInteger = NSInteger -1?

3

我试图做一件非常简单的事情,但我无法弄清楚如何实现;

NSInteger * a=10;
a=a-1;
NSlog(@"a=%d",a);

由于某些原因,它显示为 a=6

为什么会这样呢?


11
因为您声明了一个指针? - Oliver Charlesworth
小小的错别字可能会带来重大影响。 - Daij-Djan
这是Objective-C/Cocoa中我从未真正喜欢的一个领域。缺乏良好的命名空间,将Cocoa类、Cocoa类型、Cocoa函数和Cocoa常量(整数常量和字符串常量)合并为一个通用的“NS”前缀混乱。NSType t = NSFunction([NSClass methodWithConstant:NSConstant | NSConstant2]) - dreamlax
1个回答

8
你的问题在于你将变量 a 声明为指针。 大多数 Objective-C 变量都是指针,但 NSInteger 是一个例外,因为它只是一个 typedef,代表 intlong
你的代码应该像这样:
NSInteger a=10;
a=a-1;
NSlog(@"a=%d",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)
}

这被称为指针算术运算,你可以用不同的方式来编写它,例如pointer + 1,还有point[1]1[point](最后两个实际上等于*(pointer + 1))。

1
还有一些结构体,例如NSRectNSPointCGRectCGPointCGColor(虽然通常用作CGColorRef(指向结构体的指针)等)。 - David Rönnqvist
4
当你执行-1操作时,指针所指向的内存地址会减少4个字节。这是因为指针是一个整数类型,每个内存地址在计算机中都有一个固定的地址大小。在大多数情况下,指针所指向的数据类型占用四个字节。因此,当你将指针减一时,它实际上是将其值减去一个地址大小(通常为4个字节),因此指针所指向的内存地址向低地址方向移动了4个字节。 - Sulthan
@Sulthan,我更新了我的答案,并简要解释了我 认为 它是如何工作的... - Alyssa Ross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接