内存拷贝函数memcpy相关解析(C语言)

memcpy方法解析

  • 内存拷贝函数的一般用法
  • memcpy()函数的拷贝原理分析
    • 以深浅拷贝为例分析memcpy的拷贝原理
      • 用memcpy()函数与不用memcpy()函数进行拷贝数据的区分

内存拷贝函数的一般用法

 有两种拷贝函数,strcpy()和memcpy(),strcpy()只能对字符串进行拷贝复制,十分不通用,但是memcpy()可以对任意两个相同类型的数据进行拷贝复制,极大地方便了编程过程中的一些特殊需要。

函数语法:memcpy(void* to,void* from,int number);
意为从from复制大小为number的内容到to所在位置

  • 代码示例包含单个整型数据的copy和整型数组的copy,其他数据类型的copy都大致相同,就不一一给出示例了。
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
void main()
{
	int arr0,arr1=333;
	memcpy(&arr0,&arr1,sizeof(int));
	printf("%d\n",arr0);

	int *arr2,arr3[3]={1,2,3};
	arr2 = (int *)malloc(sizeof(int));
	memcpy(arr2,arr3,3*sizeof(int));
	printf("%d \n",arr2[2]);

}

需要注意,在使用memcpy()函数时同strcpy()函数一样,都需包含string.h头文件

memcpy()函数的拷贝原理分析

以深浅拷贝为例分析memcpy的拷贝原理

  • memcpy()函数是从from位置复制一份数据到to所在位置,相当于我们常用的复制粘贴效果(类似于深拷贝),还有一种通过地址指向拷贝(也就是浅拷贝),下面我们通过代码和解析加以具体的分析。

用memcpy()函数与不用memcpy()函数进行拷贝数据的区分

  • 用拷贝函数memcpy()实现数据拷贝(深拷贝) 代码
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
void main()
{
	char str1[10][10];
	printf("%d\n",sizeof(char));  //char 类型占1个字节
	printf("%d\n",sizeof(char *)); //char *占4个字节,char *表示的是地址,因此长度为4
	printf("%d\n",sizeof(str1)); 

			//与下一个程序对比,在这里str不是以指针的形式出现,而是具体的字符串数组
	char str[3][10],ptr[3][10]={"mayongen1","mayongen2","mayongen3"};
	memcpy(str,ptr,8*sizeof(sizeof(char *))); //从ptr中,拷贝8*sizeof(char *)(即8*4=32字节)大小的空间容量信息,到str内
		//用内存拷贝函数将字符串数组ptr的内容复制过去的  这里是 用拷贝函数和不用拷贝函数时两者的区别
	for(int i=0;i<3;i++)
		printf("%s\n",*(str+i));
	printf("\n");
}
  • 不用拷贝函数实现数据拷贝(浅拷贝) 代码
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
void main()
{
			//str在这里是以二重字符串指针形式出现的
	char **str,ptr[3][10]={"mayongen1","mayongen2","mayongen3"};
	str=(char **)malloc(3*sizeof(char *));//申请了三个地址
			//在这里申请的空间给三个字符串的首地址了
	*str=ptr[0];
	*(str+1)=ptr[1];
	*(str+2)=ptr[2];
		//用地址传递的方式将字符串数组ptr的内容复制过去的
	for(int i=0;i<3;i++)
		printf("%s\n",*(str+i));
	printf("\n");
}

你可能感兴趣的:(指针,数据结构,c语言)