C语言——string.h库中的memcpy()和memmove()
memcpy()和memmove()简介函数原型不能把一个数组赋值给另一个数组,可以通过循环来把数组中每个元素赋给另一个数组相应的元素。在string.h库中,strcpy()和strncpy()用于处理字符数组,而memcpy()和memmove()用来处理任意类型数组。函数原型void* memcpy(void* restrict s1, const void* restrict s2, si
·
memcpy()和memmove()简介
不能把一个数组赋值给另一个数组,可以通过循环来把数组中每个元素赋给另一个数组相应的元素。
在string.h库中,strcpy()和strncpy()用于处理字符数组,而memcpy()和memmove()用来处理任意类型数组。
函数原型
void* memcpy(void* restrict s1, const void* restrict s2, size_t n);
void* memmove(void* s1, const void* s2, size_t n);
这两个函数都是从s2指向的位置拷贝n字节到s1指向的位置,且都返回s1的值。
它们的参数都是两个指向void的指针,所以可以处理任何数据类型。因为C允许把任何类型的指针赋给void*类型的指针。
关于第三个参数,是指明待拷贝的字节数,而不是元素个数。
程序示例:
#include<stdio.h>
#include<string.h>
#include<assert.h>
#define SIZE 10
void Print_Ar(const int* ar, int n);
int main(void)
{
int ar[SIZE] = { 1,2,3,4,5,6,7,8,9,10 };
int target[SIZE] = {};
double fl[SIZE / 2] = { 2.5, 3.5, 4.5,5.5,6.5 };
puts("memcpy example:");
puts("original data:");
Print_Ar(ar, SIZE);
memcpy(target, ar, sizeof(int) * SIZE);
puts("target data:");
Print_Ar(target, SIZE);
puts("\nmemmove example:");
puts("0-4 copied to 2-6:");
memmove(ar + 2, ar, sizeof(int) * SIZE / 2);
Print_Ar(ar, SIZE);
puts("\nUsing memcpy() to copy double to int:");
memcpy(ar, fl, sizeof(double) * SIZE / 2);
Print_Ar(ar, SIZE / 2);
Print_Ar(ar + 5, SIZE / 2);
return 0;
}
void Print_Ar(const int* ar, int n)
{
assert(ar != nullptr);
for (int i = 0; i < n; ++i)
{
printf("%d ", ar[i]);
}
printf("\n");
}
运行结果
在最后一次使用memcpy()时,函数从double类型数组中拷贝到int类型数组中,结果表明:
memcpy()函数并不关心数据的类型,,而且拷贝过程中也不会进行数据转换。
如果用循环对数组中的每个元素赋值,double类型的值在赋值过程中被转换成int类型值,按原样拷贝字节,程序会把这些位组合解释成int类型。
更多推荐
所有评论(0)