正如上篇章節中所解釋的那樣,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. 指針比較
可使用關係運算符比較指針,例如==
,<
和>
。 如果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
上一篇:
Objective-C指針
下一篇:
Objective-C字串