你看看malloc()的用法,char* p = (char*) malloc(10),这样是把malloc()申请的内存解释为是一块指向char类型的数组入口地址,即指针p是指向char类型的(与声明char*相符),是地址所指向的对象被
理解成char,而不是把地址值0xfa65强制变换成字符型。“强制类型转换”是无法真的改变数据的类型的,它只是“欺骗”对方这个数据“现在被理解成这样”,但数据仍然是不变的,比如10个char的一块内存,你强制转换成int给某个指针,那么这个指针就认为现在指向了5个int(16位系统下),这个指针自我理解对方的数据而已,与数据自身无关。所以这其实并没有真的“转换”数据类型,“强制类型转换”这个译法是非常误导人的。
str = (char*) 0xfa65,只是把逻辑地址0xfa65处的数据让指针str理解成是指向了一个char类型数据,至于这个数据是否真的是char,是不管的——比如,它可能是某个double型数据的某个字节。这里,仍然没有向str指向处的地址赋值,它只是向指针赋了地址值,并且把这个指针解释成指向了char型数据。到后面,p = (int*) str又让指针p解释所指向的地址是int,然而在16位系统中,int是2char的,复制3个char(数组{'1','2','3'})到p所指向的地址中,第一个int被解释成内存数据为0x3132的整数,但这个内存映像到底被解释成怎样的整数,又与机器使用高头还是低头法则有关(0x31是整数的高位还是低位决定有不同的输出结果)。若在32位或64位系统下,整个程序的结果又与此不同。
试图解剖机器,本来是现代编程的大忌,不知道现在的学生和教科书怎么那么喜欢钻研这种问题,掌握了也不见得你是高手。爱这样深入细节的,就注定这个程序无法移植。