指针p的加减法运算
- 指针p + N
- p里面存储的地址值 + N * 指针所指向类型的占用字节数
- 指针p - N
- p里面存储的地址值 - N * 指针所指向类型的占用字节数
数组名
- 存储的是
数组首元素
的地址 - 等价于:一个指向
数组首元素
的指针 -
数组名 + 1
的跨度:数组首元素
的占用字节数
其他结论
-
&num + 1
的跨度:num
的占用字节数
int 是4个字节
float 是8个字节
例如:
- 1
int numbers[4] = {10, 20, 30, 40};
NSLog(@"%p %p", numbers, numbers + 1);
NSLog(@"%p %p", &numbers, &numbers + 1);
结果是
0x7fff5fbff790 0x7fff5fbff794
0x7fff5fbff790 0x7fff5fbff7a0
原因:
numbers : 相当于&numbers[0],等价于指向numbers[0]的指针,所以numbers + 1 就相当于numbers【0】指针的地址+ numbers[0]类型数据是4个字节数,所以numbers,numbers+1 就是差别是4个字节
&numbers : 等价于指向numbers数组的指针(是整个数组的指针),整个数组的跨度的就是4个int 类型的就是16个字节,所以&numbers ,&numbers+1 就差16个字节的地址
2
int numbers[2][2] = {
{10, 20},
{11, 22}
};
NSLog(@"%p %p", numbers[0], numbers[0] + 1);
NSLog(@"%p %p", &numbers, &numbers + 1);
结果是
0x7fff5fbff790 0x7fff5fbff794
0x7fff5fbff790 0x7fff5fbff7a0
原因:
- numbers[0] == &numbers[0][0],相当于是一个指向numbers[0][0]的指针(也就是是一个int 类型的指针),所以numbers[0] + 1,和numbers[0]才会差别4个字节的地址
- &numbers : 等价于指向numbers数组的指针(是整个数组的指针),整个数组的跨度的就是4个int 类型的就是16个字节,所以&numbers ,&numbers+1 就差16个字节的地址