1.多级指针
创建指针后一定要赋值,否则就会出现野指针。
选中的项目是p1[0]生成的,cdcall函数调用方法,先传最右边参数。
由图中可知push进3个参数,外平栈为0Ch。
ebp-8中存的是p2的值
三个printf是等价的
2 数组指针(指向数组的指针)
由上图可看到 px和 * px输出的值是一样的(都是指向数组的首地址),但是是两种不同的类型。对他们进行++操作就可得到他们类型不同,如下图:
px+1,加法运算,实际加的数px是去掉 * 号后的类型(int[2]类型)宽度为8乘1,这里加8。
(* px)+i 解释:
例子1:定义的数组指针为char (*)[2]类型。
结果:实际上是(px+3 * 2 * 1)+3 * 1 从前往后 2 * 1时char [2]的宽度,1是char的宽度。
例子2:定义的数组指针为short (*)[2]类型。
结果:实际上是(px+3 * 2 * 2)+3 * 2 从前往后 2 * 2是short [2]的宽度 ,2是short的宽度。
例子3:定义的数组指针为int (*)[2]类型。
结果:实际上是(px+3 *2 * 4)+3 * 4 从前往后 2 * 4是int [2]的宽度 ,4是int的宽度。
一维数组指针真正要取数组里的值需要两个 * 号
(px+8 * 1)+ 4 * 1,arr中类型都为int4字节。则从1开始偏移为3字节,结果为4。
(px+8 * 3)+4 * 3。从1开始偏移9个字节。结果为10。
也可以写成2维数组形式达到同样目的:
但是两种表示方法不能混用:
一个加了24h,一个加了30h。