Objective-C指针运算

正如上篇章节中所解释的那样,Objective-C指针是一个地址,它是一个数值。 因此,可以像对数值一样对指针执行算术运算。 可以在指针上使用四个算术运算符:++--+-

要理解指针运算,假设ptr是一个整数指针,它指向地址1000。假设32位整数,对指针执行以下算术运算 -

ptr++

现在,在上述操作之后,ptr将指向位置1004,因为每次ptr递增时,它将指向下一个整数位置,它是当前位置之后的4个字节。 此操作将指针移动到下一个存储器位置,而不会影响存储器位置的实际值。 如果ptr指向地址为1000的字符,则上述操作将指向位置1001,因为下一个字符在1001处可用。

1. 递增指针

在程序中使用指针比数组方便,因为变量指针可以递增,不像数组名称,它只是一个常量指针,所以不能递增。 以下程序增加变量指针以访问数组的每个后续元素 -

#import <Foundation/Foundation.h>

const int MAX = 3;

int main () {
   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* 在指针中存储数组地址*/
   ptr = var;
   for ( i = 0; i < MAX; i++) {
      NSLog(@"Address of var[%d] = %x\n", i, ptr );
      NSLog(@"Value of var[%d] = %d\n", i, *ptr );

      /* 移动到下一个位置 */
      ptr++;
   }
   return 0;
}

执行上面示例代码,得到以下结果:

2018-11-15 05:50:37.956 main[195398] Address of var[0] = 518e55a4
2018-11-15 05:50:37.958 main[195398] Value of var[0] = 10
2018-11-15 05:50:37.958 main[195398] Address of var[1] = 518e55a8
2018-11-15 05:50:37.958 main[195398] Value of var[1] = 100
2018-11-15 05:50:37.958 main[195398] Address of var[2] = 518e55ac
2018-11-15 05:50:37.958 main[195398] Value of var[2] = 200

2. 递减指针

递减指针同样也适用,该指针减少其数据类型的字节数,如下所示 -

#import <Foundation/Foundation.h>

const int MAX = 3;

int main () {
   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* 在指针中存储数组地址 */
   ptr = &var[MAX-1];
   for ( i = MAX; i > 0; i--) {
      NSLog(@"Address of var[%d] = %x\n", i, ptr );
      NSLog(@"Value of var[%d] = %d\n", i, *ptr );

      /* 移动到上一个位置 */
      ptr--;
   }
   return 0;
}

执行上面示例代码,得到以下结果:

2018-11-15 05:53:29.272 main[63838] Address of var[3] = 3667141c
2018-11-15 05:53:29.274 main[63838] Value of var[3] = 200
2018-11-15 05:53:29.274 main[63838] Address of var[2] = 36671418
2018-11-15 05:53:29.274 main[63838] Value of var[2] = 100
2018-11-15 05:53:29.274 main[63838] Address of var[1] = 36671414
2018-11-15 05:53:29.274 main[63838] Value of var[1] = 10

3. 指针比较

可使用关系运算符比较指针,例如==<>。 如果p1p2指向彼此相关的变量,例如同一数组的元素,则可以有意义地比较指针:p1p2

以下程序通过递增变量指针来修改前一个示例,只要它指向的地址小于或等于数组的最后一个元素的地址,即&var [MAX - 1]-

#import <Foundation/Foundation.h>

const int MAX = 3;

int main () {
   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* 获取到指针中第一个元素的地址*/
   ptr = var;
   i = 0;

   while ( ptr <= &var[MAX - 1] ) {
      NSLog(@"Address of var[%d] = %x\n", i, ptr );
      NSLog(@"Value of var[%d] = %d\n", i, *ptr );

      /* 指向下一个位置 */
      ptr++;
      i++;
   }
   return 0;
}

执行上面示例代码,得到以下结果:

2018-11-15 05:55:48.173 main[60442] Address of var[0] = 6a8cb7f4
2018-11-15 05:55:48.175 main[60442] Value of var[0] = 10
2018-11-15 05:55:48.175 main[60442] Address of var[1] = 6a8cb7f8
2018-11-15 05:55:48.175 main[60442] Value of var[1] = 100
2018-11-15 05:55:48.175 main[60442] Address of var[2] = 6a8cb7fc
2018-11-15 05:55:48.175 main[60442] Value of var[2] = 200

上一篇: Objective-C指针 下一篇: Objective-C字符串