首页
社区
课程
招聘
10
[原创]从反汇编的角度学C/C++之数组,指针及字符串
发表于: 2021-9-28 16:08 6804

[原创]从反汇编的角度学C/C++之数组,指针及字符串

2021-9-28 16:08
6804

    指针最为C/C++最有特色的数据类型,其中保存着某个数据的地址,而对指针的解引用可以让我们获取对应类型的数据。那么不同类型的指针在内存中有什么样的不同,他们又是如何获取地址中的数据的。请看下面这个实例:

    由上我们可以得出结论:在内存中,无论是什么类型的指针,他都占有4个字节,保存着数据的地址,而解引用的过程就是拿出这个保存的地址,在去这个地址中拿出所需要的值。他们在内存中的保存形式是一样的,只是在解引用使用的时候不同类型的指针会有不同的使用方法。最终的程序运行结果如下: 

    指针的指针也是同样的原理,唯一的不同就是对地址多一次的取址或者解引用。

    在C/C++中,我们可以使用数组来保存一组连续的相同类型的数据。那么不同类型的数组在内存中的表现形式究竟如何?他们与指针的关系又是怎么样的?看下面这个实例:

    可以看出,声明为数组的变量名就是数组的首地址。对数组的使用时,根据数组所保存的数据类型的宽度不同,程序所赋值的地址也不同。如上面整型数组,数组之间的元素相差4个字节,而字符型数组,数组元素之间就是相差1字节。那么对于数组的寻址过程是怎么样的,他与指针又有什么不同?看下面的实例:

    从上面的分析可以得出,无论是数组还是指针,他们在对变量进行加减操作,也就是对arrInt或pInt进行加减操作的时候,不只是数学上简单的加减上随后的数字,而是会根据变量所指类型的宽度来乘以相应的大小。不过数组和指针也存在着不同,数组首先把数组宽度赋值到寄存器中,然后乘以相应的下标,得出距离后和数组首地址进行相加,而指针是直接加上需要的偏移大小。程序运行结果如下:

    在C/C++中可以声明多维数组,对应的指针也就是指向数组的指针。那么多维数组和一维数组有什么区别呢?请看下面的实例:

    由上我们可以看出,其实二维数组和一维数组没有什么太大的差别,只是他寻找数据的时候要多跨一个维度,而且这个维度的大小和第二维的大小有关。指向数组的指针在进行寻址的时候也是如此,他需要考虑所指数组的大小。

    在C/C++中,用""包围的字符被称为字符串,每个字符串的最后都是以0作为字符串的结束。那么字符串在内存中是如何保存的和我们的字符有什么不同。看下面这个实例:

    那么这里的的0x000F31B0存储了什么内容,我们可以在内存窗口查看


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-10-20 11:18 被1900编辑 ,原因:
收藏
免费 10
支持
分享
赞赏记录
参与人
雪币
留言
时间
東陽不列山
为你点赞!
2025-2-15 02:11
一路南寻
为你点赞!
2025-2-12 01:10
嫉妒的死远点
感谢你的贡献,论坛因你而更加精彩!
2024-12-27 04:27
心游尘世外
感谢你的贡献,论坛因你而更加精彩!
2024-7-9 05:30
QinBeast
感谢你的贡献,论坛因你而更加精彩!
2024-7-8 05:23
Ally Switch
为你点赞~
2022-9-26 09:37
hzmslx
为你点赞~
2022-8-22 12:19
PLEBFE
为你点赞~
2022-7-28 00:13
hey james
为你点赞~
2022-1-26 12:18
kira_yamato
为你点赞~
2021-9-29 15:36
最新回复 (1)
雪    币: 1507
活跃值: (2403)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
第三篇
2023-1-25 19:14
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册