07-安全攻防之指针宽度

我们都知道指针在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个字节;
答案如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值