正如上篇章节中所解释的那样,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