一、指针大小问题:【这条内容我还不确定是否准确,网上说法纷纭,但对于现代的编译器来说我更相信是准确的】
C++中任何指针的大小在同一编译器下一定是相同的,一般为32位即4个字节,但对于64位机子也可能是64位,但同一编译器下,各种类型的指针要么同位32位要么同为64位。正因为如此,所以很多C++库函数都使用Void*作为形参且可以保证跨平台(不会出现实参作为一种具体指针类型转换为形参Void*是出现数据截断现象)。
另外,有时常常听说C++中普通函数、成员函数、虚函数等的不同类型的函数指针大小不同,也是对的,但实际上C++中函数指针并不算真正的指针,只不过挂了指针的名字而已,所以并不和上面冲突,讨论C++中任何类型的指针大小时并不包含函数指针。
举个例子:
一下c++标准,里面提到了:把任何一个类型的指针先转换成void*类型,然后在转换回来,原指针的值不改变。即:
也就是如果T *p=100;那么 static_cast<T*>(static_cast<void*>(p)) == 100一定成立。
二、Void*作为形参的理解:【这条内容是准确的】
以库函数memset来说吧,第一,形参是void*,它表示memset不关心传入指针的类型,因为memset本身就设计为字节操作的,指针类型对于memset是多余的东西,memset关心的是使用者要给我一个位置,当然这个位置还包括后面n个字节;第二,形参不指向const类型,表示