首先 ,一个指针,不管它指向哪种数据类型,但指针本身所需的内存大小是固定的。(即4个bytes)
有个声明:
class A{
public:
A();
virtual ~A();
virtual void rotate();
protected:
int loc;
String name;
};
A a("Zoey");
A *p=&a;
这里的a是一个类的物件,而p是一个指向类的指针。如果要求这个类的所需内存大小的话。应该是4+8+4。(如果是string是传统的8bytes的话(包括一个4-byte的指针和一个用来表示字符串长度的整数),4是int loc的大小,8是String的大小,后一个4指的是一个Vptr。/*对此,我还有个疑问,这里的vptr是公用的么?因为你可以看到A里有两个virtual func。)。*/ 那么,p所能横跨的地址空间为1000--1015(假设起始地址是1000的话。)。
就以内存需求的观点来说,一个指向类的指针和一个指向整数和一个指向String的指针没有什么不同,他们都需要一个内存单元(我想应该是个4bytes)来存放机器地址(应该是word)。“指向不同类型的指针”间的差异,既不在其指针表示方法不同,也不在其存放内容类型不同(都是一个word型的地址)。而是在其所寻址(operator*)出来的object类型不同,也就是说,“指针类型”会教导编译器如何解释某个特定地址中的内容及其大小。
至此,你应该轻而易举地知道,一个指向地址1000的int型指针,在32位机器上,,他所能涵盖的地址空间,是1000-1003,而当它是个指向上述A类型的指针的话,他说能涵盖的地址空间为1000-1015.嗯,那么如果void*的指针指向地址为1000时,他将涵盖怎样的地址空间呢?这我怎么知道!他只含有一个地址,而不能通过他操作其所指的object的。(/*他存放的是什么地址,他的object又是什么?*/)
所以,cast其实是一种编译器指令。大部分情况下他并不改变指针所含的真正地址,它只影响“被指出之内存的大小和其内容”的解释方式。