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字串