定义:在内存中用来copy一个数组内一定字节大小的数据到另一个数组内。
头文件:#include<string.h>
类型:
void *memcpy(void*dest, const void *src, size_t n)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//void* my_memcpy(void* s1, void* s2, size_t n) {
// assert(s1 && s2);
// char* start = (char*)s1;
// while (n) {
// *(char*)s1 =*(char*)s2;
// ((char*)s1)++;
// ((char*)s2)++;
// n--;
// }
// return start;//这是我们模拟实现的memcpy;但是memcpy有个缺点不能copy重叠的内存区域
//
//
//}
//int main() {
// char str1[9] = "abcdefg";
// char str2[4] = "mnk";
// /*memcpy(str1, str2, 2);*/
// my_memcpy(str1, str2, 2);
// printf("%s", str1);
// return 0;
//}
接下来会打印:
我们copy有重叠的就需要用memmove函数:
void* my_memmove(void* s1, void* s2, size_t n) {
assert(s1 && s2);
char* ret = (char*)s1;
if (s1 < s2) {
while (n) {
*(char*)s1 = *(char*)s2;
((char*)s1)++;
((char*)s2)++;
n--;
}
}
else while (n) {
*((char*)s1 + n - 1) = (*(char*)s2 + n - 1);
n--;
}
return ret;
}//以上也是我们模拟memmove函数;
int main() {
char str1[9] = "abcdefg";
my_memmove(str1,str1+2,4);
printf("%s", str1);
return 0;
}
打印有重叠的如下:
int main() {
char str1[20] = "xxxxxxxx";
memset(str1 + 4, 'K', 2);
printf("%s", str1);
return 0;
}//如可以把从str1开始后的四个位置开始被k取代直到两个字节后
但是这个函数有个缺点无法将一个数组内所有的数据都更改,
int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
memset(arr, "5", 40);
for (int i = 0; i < 10; i++) {
printf("%d", arr[i]);
}//这里将不会呈现满数组的5;
memcmp类似于字符串中strcmp函数;比较的是两个数组内的元素大小,输出数字跟strcmp一样
类型:
int memcmp(const void *buf1, const void *buf2, unsigned int count);
int main() {
char str1[10] = "abd";
char str2[5] = "af";
int ret=memcmp(str1, str2, 2);
printf("%d", ret);
}
输出结果:
1·接下来我们用一个图来解释一下:
我们来用一个代码判断机器是大小端:
int main() {
int n = 1;
if (*(char*)&n == 1) {
printf("小端");
}
else printf("大端");
return 0;
2·对于有无符号字符:signed char范围为-128~127,而unsigned char 为0~255 ;
首先我们要明白我们存的是补码,再不同类型进行转化我们有时便需要整型提升以及截段啥的
因此我们还要掌握我们在有符号char类型加一从0开始到127然后再加一到-128,此后不断减小,直到-1,接着变为零这样循环。