先看下面一段代碼
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所指的地址所在的內存中