memcpy与strcpy的详细理解

目录

一:strcpy的用法

二:memcpy的用法

参数

返回值:dest

三:strcpy与memcpy区别


一:strcpy的用法

定义于头文件中,

char* strcpy( char* dest, const char* src );

复制 src 所指向的字符串,包含空终止符,到首元素为 dest 所指向的字符数组。

strcpy函数是字符串拷贝函数,strcpy(char *destination,const char* sourse),两个参数是字符串首地址

strcpy的例子用法

#include
using namespace std;
int main(void){
	char a[]="hejb";//注意这里不能用string a="hegb",是字符数组专属的 
	char b[]="hdsjb";
	strcpy(a,b);
	cout<

二:memcpy的用法

 定义在头文件

void* memcpy( void* dest, const void* src, std::size_t count );

参数

dest - 指向要复制的对象的指针
src - 指向复制来源对象的指针
count - 复制的字节数

返回值:dest

memcpy的用法例子,一

#include
using namespace std;
int main(void){
	int a[4]={1,2,3,4};
	int b[5]={5,6,7,8,9};
	memcpy(a,b,sizeof(b));//这里第三个参数单位是"字节",长度选择尽量用b的长度 
	for(int i=0;i<5;i++){//输出为5 6 7 8 9
		cout<<*(a+i)<<" ";
	}
	return 0;
}

一个int型为四个字节,sizeof(b)是求b 数组的字节数;

memcpy的用法例子,二

#include
using namespace std;
int main(void){
	int a[4]={1,2,3,4};
	int b[5]={5,6,7,8,9};
	memcpy(a+2,b,sizeof(b));//表示从第三个元素开始复制b的5个元素 
	for(int i=0;i<7;i++){//输出为:1 2 5 6 7 8 9 
		cout<<*(a+i)<<" ";
	}
	return 0;
}

对于string,char,double与上面用法相同。

如果代码写成如下所示

#include
using namespace std;
int main(void){
	int a[5]={0,1,2,3,4};
	int b[5]={-1,6,7,8,9};
	memcpy(a+2,b,1);
	for(int i=0;i<5;i++){
		cout<<*(a+i)<<" ";//输出为 0 1 255 3 4 
	}
	return 0;
}

这里要稍微理解下little-endian和big-endian(litter-endian:高位字节数据存放在内存高地址处,低位数据存放在内存低地址处。bit-endian:高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处。)

按照litter-endian存储方式说明下原因

memcpy与strcpy的详细理解_第1张图片

 大家可以将-1替换为:256(输出为0 1 0 3 4),255(输出为0 1 255 3 4),257(输出为0 1 1 3 4),并且尝试理解;

三:strcpy与memcpy区别

memcpy和strcpy都是C语言中的字符串操作函数。

但它们的功能不同。

memcpy用于将内存块复制,可以复制任意类型的数据,没有字符串结束符的限制;

而strcpy用于将一个字符串复制到另一个字符串中,只能操作字符串类型的数据,会自动复制字符串结束符。

你可能感兴趣的:(c++,开发语言,c语言)