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类型。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐