文章也同时在简书更新
参考: iOS 最详细的解析(数组与指针)笔试题,并做了改进。
引题
先来看一下这道题目,如下代码的输出结果是什么?
|
|
在看后文的解释前,不妨自己思考一下。
好了,相信你已经思考过了,我们来揭晓结果,结果是令人匪夷所思的458758,答对了吗?也许你会有疑惑,那么请看下面的注解,在其中增加了些许解释代码,并在关键代码后有注释。
详细注释解答:
|
|
内存地址分配图:
重点:
- 字节序
- 内存地址分配
- 类型转换
补充
最后我们通过汇编,来深入理解一下如下几行代码的含义:
|
|
对应的汇编分别为:
如图三个红圈,这边是AT&T的汇编格式,我们还是以更好看的intel的样式来说明:
- 第一个红圈,左边的
$0x00
立即数赋给[rbp-0x28]
这个内存地址,0x00
就是NULL
的值,而[rbp-0x28]
内存地址就是指针p
的值(不是*p
)。 - 第二个红圈,
rcx
寄存器中含有arrayName
数组的首地址(注意:arrayName+0
和&arrayName
取得的地址是相同的),赋给rdx
;rdx
在把它赋给[rbp-0x28]
,即赋给指针p
。 - 第三个红圈,第一句中,
$0x14
立即数就是十进制的20,表明10个short*
型,因为每个short *
占2B。$0x14
赋给rcx
寄存器,rcx
再赋给指针p
,最终导致前文所说的,所谓移动整个数组位,从第0个元素移到了第11个元素(虽然数组并没有第11个元素,但位置的移动可以这样理解)。
That’s all. Thanks for reading.
微信公众号
第一时间获取最新内容,欢迎关注微信公众号:「洛斯里克的大书库」。