正如上篇章節中所解釋的那樣,Objective-C指標是一個地址,它是一個數值。 因此,可以像對數值一樣對指標執行算術運算。 可以在指標上使用四個算術運算子:++
,--
,+
和 -
要理解指標運算,假設ptr
是一個整數指標,它指向地址1000
。假設32
位整數,對指標執行以下算術運算 -
ptr++
現在,在上述操作之後,ptr
將指向位置1004
,因為每次ptr
遞增時,它將指向下一個整數位置,它是當前位置之後的4
個位元組。 此操作將指標移動到下一個儲存器位置,而不會影響儲存器位置的實際值。 如果ptr
指向地址為1000
的字元,則上述操作將指向位置1001
,因為下一個字元在1001
處可用。
在程式中使用指標比陣列方便,因為變數指標可以遞增,不像陣列名稱,它只是一個常數指標,所以不能遞增。 以下程式增加變數指標以存取陣列的每個後續元素 -
#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
遞減指標同樣也適用,該指標減少其資料型別的位元組數,如下所示 -
#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
可使用關係運算子比較指標,例如==
,<
和>
。 如果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;
/* 獲取到指標中第一個元素的地址*/
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