一, 内存拷贝函数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