memcpy函数区别于语句:数据类型1 d = *(数据类型2*)&st在于:在功能上,前者包含后者。具体说明如下:
charst[10];
__int64 d = *(__int64 *)&st;
等价于
memcpy(&d,st,sizeof(__int64));//sizeof(__int64)=8
就是说将数组st中前8个字节的内容拷贝到d上,即将数组st中一个完整的__int64的大小的区域复制到d上。
memcpy函数的功能要比类似于__int64 d = *(__int64 *)&st;的语句所能完成的功能更为灵活,即memcpy函数也可以完成如下功能:
memcpy(&d,st,3);
即memcpy函数可以将数组st中一个任意字节大小的区域(这里是小于一个完整的__int64的大小)复制到d上,而语句:数据类型1 d = *(数据类型2*)&st只能将数组st中一个数据类型2所占的大小的区域复制到d上。
由于memcpy函数只复制3个字节的数据到d上,d上剩余5个字节还是原始数据,所以如果变量原先没有被初始化(为0,即memset(&d,0,sizeof(__int64))),则此时d显示的值会出错。
memcpy函数会复制指定长度的数据才会结束,在没有达到指定长度前即使字符数组st遇到了终止符'\0'也不会停止的。
注释:
如何能证明memcpy函数只复制3个字节的数据到d上,d上剩余5个字节还是原始数据不变呢?
若d是一个数组时,
在vs2010下,可以在程序处于调试时,先在未执行memcpy函数前看下变量d里的值,在执行memcpy函数后发现变量d里的前3个字节的值被修改了即变为红色字体(即使赋值为原值即值修改前后的值一样),未被动过的值依旧是黑色字体。
附加:
强制类型转换和隐式类型转换|自定义类型转换语句__int64 d = *(__int64 *)&st的说明