在汇编的角度来理解C语言3级指针

本文通过一个具体的C语言代码实例,详细解释了多级指针的概念及其工作原理,展示了如何通过不同级别的指针访问底层的数据。

C语言中指针使用频率是很高的,我们知道指针一个特殊的变量,它的值是指向一块内存地址

我写了一个简单的C代码

void Test1()
{
    int ***ptr_int = NULL;
 
    int i1 = 100;
 
    int *ptr_1 = &i1; //一级内存地址空间偏移
 
    int **ptr_2 = &ptr_1; //二级内存地址空间偏移
 
    ptr_int = &ptr_2; //三级内存地址空间偏移
 
    int k = ***ptr_int;
}

编译,然后OllyDbg载入


我们一句句来


mov dword ptr ss:[ebp-0xC],0x0 
将值0 放入栈空间地址  ss:[ebp-0xC]  物理地址为  00D3FBDC 
对应C代码    int ***ptr_int = NULL;


mov dword ptr ss:[ebp-0x18],0x64
将值0x64 放入栈空间地址 ss:[ebp-0x18]  物理地址为  00D3FBD0  00000064
对应C代码  int i1 = 100;




这两行代码 先将  ss:[ebp-0x18] 地址赋给寄存器 eax,然后将eax值赋给地址 ss:[ebp-0x24]
00E41716    8D45 E8         lea eax,dword ptr ss:[ebp-0x18]
00E41719    8945 DC         mov dword ptr ss:[ebp-0x24],eax


对应C代码 
int *ptr_1 = &i1; //一级内存地址空间偏移
这里的 ss:[ebp-0x18]便是 整型变量i1的内存地址






这两行代码 做的事情同上,但注意地址变化了,这是是将地址 ss:[ebp-0x24] 赋给 ss:[ebp-0x30]
而 ss:[ebp-0x24]就是指针变量 int *ptr_1的值
00E4171C    8D45 DC         lea eax,dword ptr ss:[ebp-0x24]
00E4171F    8945 D0         mov dword ptr ss:[ebp-0x30],eax


对应C代码
int **ptr_2 = &ptr_1; //二级内存地址空间偏移






这两行代码 做的事情同上,  将二级指针变量地址  ss:[ebp-0x30] 赋给  ss:[ebp-0xC]三级指针变量
00E41722    8D45 D0         lea eax,dword ptr ss:[ebp-0x30]
00E41725    8945 F4         mov dword ptr ss:[ebp-0xC],eax


对应C代码
ptr_int = &ptr_2; //三级内存地址空间偏移




将3级指针地址对应的解引用 取 出来。
00E41728    8B45 F4         mov eax,dword ptr ss:[ebp-0xC]  


对应C代码


int k = ***ptr_int;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值