一.memcpy函数:
定义:在内存中用来copy一个数组内一定字节大小的数据到另一个数组内。
头文件:#include
类型:
void memcpy(voiddest, const void *src, size_t n)
define _CRT_SECURE_NO_WARNINGS
include
include
//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;
}
打印有重叠的如下:
二.memset函数:
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函数:
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,接着变为零这样循环。