先看下面一段代码
class HeapWord
{friend class VMStructs;private:char *i;
};
主函数
#include "HeapWord.hpp"
int main()
{HeapWord *heapword = new HeapWord();HeapWord *p = new HeapWord();HeapWord **p1 = new HeapWord *();heapword += 3;*(HeapWord **)p = heapword;*p1 = heapword;return 0;
}
这里首先在堆中创建了一个HeapWord
对象的空间,然后其首地址放入heapword
中
然后又在堆中创建一个HeapWord
对象的空间,然后其首地址放入p
中
然后声明一个变量p1
,该对象指向一个指针,该指针指向的是HeapWord
类型。
HeapWord **p1 = new HeapWord *();
指针加法
如果执行heapword+=3
,其结果是原本的heapword
值加上0x18
。因为C编译器会自动进行类型计算,将原本的加法转换为具体的字节加法。
用gdb调试如下:
执行之后
可见,其结果增加了0x18
取值
*(HeapWord **)p = heapword;
拆分来看,首先p是一个指针,因此可以强制转为另一种指针,因为指针的本质就是一个64位的整型值。因此(HeapWord**)p
表示p是一个指针,这个指针只能指向一个对象,该对象是HeapWord
指针。即
p--> HeapWord*()
而*(HeapWord**p)
就是将HeapWord*()
地址内的值取出来放入p所指的地址所在的内存中