内存拷贝函数void *memcpy(void *dest, const void *src, size_t n);以及内存设置函数memset

本文介绍了C/C++中的两个内存操作函数:memcpy用于内存拷贝,memset用于内存设置。详细讲解了它们的使用方法和功能,包括memcpy如何优雅地复制数据,memset如何设置内存区域的字节值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一, 内存拷贝函数memcpy

内存拷贝函数需要头文件为:
C中为#include <memory.h>#include <string.h>
C++中为#include <cstring>#include <string>

代码解说:
数组farmer中存储10个农民伯伯的薪水(日薪,农民伯伯月收入过万很正常),将其中的数据拷贝到起始地址为salary的动态内存中

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void) {
	int farmer[10] = {160,230,100,650,490,330,550,454,780,300};
	int num = 0;//农民伯伯数量
	int *salary = NULL;

	printf("请输入雇佣农民的数量:");
	scanf_s("%d", &num);

	salary = new int[num];//分配num个整型变量的动态内存

	//第一种 逐个赋值
	for(int i=0; i<sizeof(farmer)/sizeof(int); i++) {
		salary[i] = farmer[i];
	}

	//第二种 内存拷贝
	memcpy(salary, farmer, sizeof(farmer));

	//如果num大于10,则统一赋值为700
	for(int i=sizeof(farmer)/sizeof(int); i<num; i++) {
		salary[i] = 700;
	}
	
	for(int i=0; i<num; i++) {
		printf("第%d个能民的薪水:%d\n", i+1, salary[i]);
	}
	delete[] salary;//释放动态内存
	
	system("pause");
	return 0;
}

这里用了两种方式:
第一种,使用for循环逐个赋值
第二种,使用内存拷贝函数memcpy,更加优雅。

语句memcpy(salary, farmer, sizeof(farmer));意义为:
从起始地址farmer开始拷贝,拷贝sizeof(farmer)个字节为止,将这些拷贝到的数据复制到以起始地址salary开始的动态内存中。

内存拷贝函数
void *memcpy(void *dest, const void *src, size_t n);
#include<string.h>
功能:从源 src 所指的内存地址的起始位置开始拷贝 n 个字节到目标 dest 所指的 内存地址的起始位置中(对标题的解说)

二, 内存设置函数memset

memset函数需要头文件为:
C中为#include <memory.h>#include <string.h>
C++中为#include <cstring>#include <string>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
	int visit[23];

	//从地址visit开始,将每一个字节设置为0,一共设置sizeof(visit)个字节
	memset(visit, 0, sizeof(visit)); 

	for(int i=0; i<23; i++)
		printf(" %d", visit[i]);

	system("pause");
	return 0;
}

输出结果为:
在这里插入图片描述
memset(visit, 0, sizeof(visit))的作用:从地址visit开始,将每一个字节设置为0,一共设置sizeof(visit)个字节!

注意:这里说的是字节, 而不是数组visit里面的成员,数组visit里面的成员是int类型,有四个字节!

改变一下, 不设置为0, 设置为1:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
	int visit[5];

	memset(visit, 1, sizeof(visit));

	for(int i=0; i<5; i++)
		printf(" %d\n", visit[i]);

	system("pause");
	return 0;
}

输出为:
在这里插入图片描述
16843009是什么?用计算器将其转化为二进制:
在这里插入图片描述
计算器转化为:

0001 0000 0001 0000 0001 0000 0001

可以看出一共有4个字节,32个bit位,一个字节有8个bit位,前面还有四个0,省略了!

不省略就是这样:

0000 0001 0000 0001 0000 0001 0000 0001
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值