memcpy (void* _Dst,void const* _Src,size_t _Size)
作用:将_Src数组中的内容复制_Size个字节长度,给到_Dst数组。
注意:指针是用void修饰的,所以_Dst和_Src两个指针都是由原有的数据类型强制转换为void类型进行操作的,这样,不同类型之间就可以进行复制传值操作了,但是要注意的一点是,不同类型之间的数据长度不同,所以在复制时候要注意匹配相同的数据长度。此外,在进行处理时,最好采用16进制的方式去操作,这样理解起来更为直观。
char a[8]={0x12,0x34,0x56,0x78,0x90,0x14,0x52,0x46 };
short b=0;
memcpy(&b,a+1,2);
printf("b=%x", b);
此段代码的作用是把0x34和0x56拼接起来送到b,输出的最终结果是:0x5634。
输出用的是%x,表示以十六进制进行输出。
char型数据占用一个字节,而short型数据占用两个字节,所以把char型数据拷贝到short型数据中时,传递的字节长度是2,如果把char型数据传递给int型数据,传递的字节长度应该是4。
拼接的时候低字节放在低位,高字节放在高位。
此外,memset函数在对数组进行赋值的过程中,在dest的末尾不会追加结束符’\0’,因此,在使用此函数时,一般不要把目标数组全部占用,留一位写’\0’.
eg:
void test()
{
char str1[] = "123456";
char str2[3];
memcpy(str2, str1, 3);
cout << str2 << endl;
}
运行结果:123烫烫烫烫烫烫烫烫烫烫烫烫蘮??
解决办法:
void test()
{
char str1[] = "123456";
char str2[4];
memcpy(str2, str1, 3);
str2[3]=0;
cout << str2 << endl;
}
运行结果:123
或者
char str1[] = "123456";
char str2[4];
memset(str2,0,4);
memcpy(str2, str1, 3);
cout << str2 << endl;
运行结果:123
或者
char str1[] = "123";
char str2[4];
memcpy(str2, str1, strlen(str1)+1);
cout << str2 << endl;
运行结果:123
以上可以看出,要存储字符串的数组应该比字符串的长度至少多1,多出来这一位就是为了存储结束符’\0’.