Objective-C 指针运算
Objective-C 的指针是一个地址,它是一个数值。因此可以在数值上的指针执行算术运算。有四种,可以用来对指针的算术运算符:+ +, - ,+, -
要理解指针的算术运算,让我们考虑,ptr是一个整数的指针,它指向的地址1000。假设32位的整数,让我们执行以下指针的算术运算:
ptr++
现在,上面的操作后,指针将指向的位置1004,因为每次指针递增,它会指向到下一个整数的位置,这是到当前位置的下一个4个字节。此操作将指针移动到下一个内存位置,而不会影响实际值的内存位置。如果ptr指向一个字符的地址是1000,那么上面的操作将指向下一个字符的位置1001,因为将达到1001。
递增一个指针
我们优选使用我们的程序,而不是一个数组中的指针,因为变量的指针可以递增,不能递增数组名不一样,因为它是一个常量指针。下面的程序递增变量的指针来访问每个后续元素的数组:
#import <Foundation/Foundation.h> const int MAX = 3; int main () { int var[] = {10, 100, 200}; int i, *ptr; /* let us have array address in yiibaier */ ptr = var; for ( i = 0; i < MAX; i++) { NSLog(@"Address of var[%d] = %x ", i, ptr ); NSLog(@"Value of var[%d] = %d ", i, *ptr ); /* move to the next location */ ptr++; } return 0; }
上面的代码编译和执行时,它产生的结果如下:
2013-09-14 00:08:36.215 demo[32000] Address of var[0] = 7e6f2a70 2013-09-14 00:08:36.216 demo[32000] Value of var[0] = 10 2013-09-14 00:08:36.216 demo[32000] Address of var[1] = 7e6f2a74 2013-09-14 00:08:36.216 demo[32000] Value of var[1] = 100 2013-09-14 00:08:36.216 demo[32000] Address of var[2] = 7e6f2a78 2013-09-14 00:08:36.216 demo[32000] Value of var[2] = 200
递减指针
同样的考虑也适用于递减的指针,从而降低(递减)它的值由如下图所示,它的数据类型的字节数:
#import <Foundation/Foundation.h> const int MAX = 3; int main () { int var[] = {10, 100, 200}; int i, *ptr; /* let us have array address in yiibaier */ ptr = &var[MAX-1]; for ( i = MAX; i > 0; i--) { NSLog(@"Address of var[%d] = %x ", i, ptr ); NSLog(@"Value of var[%d] = %d ", i, *ptr ); /* move to the previous location */ ptr--; } return 0; }
上面的代码编译和执行时,它产生的结果的东西如下:
2013-09-14 00:12:22.783 demo[13055] Address of var[3] = ea4c618 2013-09-14 00:12:22.783 demo[13055] Value of var[3] = 200 2013-09-14 00:12:22.783 demo[13055] Address of var[2] = ea4c614 2013-09-14 00:12:22.783 demo[13055] Value of var[2] = 100 2013-09-14 00:12:22.783 demo[13055] Address of var[1] = ea4c610 2013-09-14 00:12:22.783 demo[13055] Value of var[1] = 10
指针比较
指针可以使用关系运算符,如:==,<,>等。如果p1和p2指向彼此相关的变量,如相同的数组元素,则p1和p2可以有意义的比较。
下面的程序修改前面的例子中,一个递增的变量的指针,只要它所指向的地址可以是小于或等于的地址的最后一个元素的数组是var [MAX - 1]:
#import <Foundation/Foundation.h> const int MAX = 3; int main () { int var[] = {10, 100, 200}; int i, *ptr; /* let us have address of the first element in yiibaier */ ptr = var; i = 0; while ( ptr <= &var[MAX - 1] ) { NSLog(@"Address of var[%d] = %x ", i, ptr ); NSLog(@"Value of var[%d] = %d ", i, *ptr ); /* yiibai to the previous location */ ptr++; i++; } return 0; }
上面的代码编译和执行时,它产生的结果的东西如下:
2013-09-14 00:15:49.976 demo[24825] Address of var[0] = ae1235a0 2013-09-14 00:15:49.976 demo[24825] Value of var[0] = 10 2013-09-14 00:15:49.977 demo[24825] Address of var[1] = ae1235a4 2013-09-14 00:15:49.977 demo[24825] Value of var[1] = 100 2013-09-14 00:15:49.977 demo[24825] Address of var[2] = ae1235a8 2013-09-14 00:15:49.977 demo[24825] Value of var[2] = 200