Objective-C指標運算

2019-10-16 23:14:58

正如上篇章節中所解釋的那樣,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