我们都知道指针在iOS中的长度为8
,可以对指针进行加减运算
,但是编辑器决定了指针不能做乘法和除法运算
!
在指针运算过程中,运算结果,
由它所指向的数据类型的宽度
决定的!
换句话说,也就是看去掉一个" * "之后的类型决定的。
例如, char * a; 那么a的的指针类型是 char;
int * a; 那么a的指针类型是 int;
注意:int a, 那么a就是基本数据类型 int,跟指针没有关系。
指针的运算
- 问题:
char * a;
a = (char *)100;
a++;
那么a的值是多少呢?
首先看a的指针宽度,去掉一个“*”后的类型是char,那么指针的类型是char,char占用的1个字节,所以a++ = a + 1 = 100 + 1 = 101
- 问题:
int * a;
a = (int *)100;
a++;
那么a的值是多少呢?
首先看a的指针宽度,去掉一个“*”后的类型是int,那么指针的类型是int,int占用的是4个字节,所以a++ = a + 4 = 100 + 4 = 104
- 问题:
int ** a;
a = (int *)100;
a++;
那么a的值是多少呢?
首先看a的指针宽度,去掉一个“*”后的类型是int *,那么指针的类型是int *,int *占用的是8个字节,所以a++ = a + 8 = 100 + 8 = 108
指针的有趣小使用
例如数组的取值,我们常规的取数据的第几位,其实我们也可以根据数组的地址偏移来取值。
- 根据数组的第几位来取值,代码如下:
int arr[5] = {1,2,3,4,5};
for (int i = 0; i < 5; i++) {
NSLog(@"%d", arr[i]);
}
- 根据数组的地址偏移来取值
int arr[5] = {1,2,3,4,5};
int *a = arr;
for (int i = 0; i < 5; i++) {
NSLog(@"%d", *(a++));
}
小记:sp的拉伸16字节的倍数
指针在汇编的反汇编
- 问题:
char * *p;
char c = *(*(p + 2) + 2)
那么上面那两句代码转成汇编是什么样的?思考后再看答案哦~
首先 ((p + 2) + 2) 等价于
(1)char *a = *(p + 2); p的指针类型是char *
, 也就是8个字节,所以 *(p + 2), 等于p的地址上偏移 16个字节
(2)char c = (a + 2); a的指针类型是char
, 也就是1个字节,所以(a+ 2), 等于a的地址上偏移2个字节;
答案如下:
- 问题:
char * *p;
char c = p[1][2];
那么上面那两句代码转成汇编是什么样的?思考后再看答案哦~
首先p[1]取出来的是
char *
,占用8个字节, 所以,p[1], 就是在p的地址上偏移8个字节;
其次,因为char *a = p[1]; 所以a[2] 取出来的是char
, 占用1个字节;所以a[2], 就是在a的地址上偏移2个字节;
答案如下: